J'essaie de mapper le str.split
fonction à un tableau de chaînes. à savoir, je voudrais diviser toutes les chaînes dans un tableau de chaînes qui suivent le même format. Une idée de comment faire ça avec map
en python? Par exemple, supposons que nous avons une liste comme celle-ci:
>>> a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
voulez diviser les chaînes par espace (split ("")) en utilisant map pour avoir une liste comme:
>>> [['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]
Bien qu'elle ne soit pas bien connue, il existe une fonction conçue spécialement à cet effet, operator.methodcaller :
>>> from operator import methodcaller
>>> a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
>>> map(methodcaller("split", " "), a)
[['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]
Cette technique est plus rapide que les approches équivalentes utilisant des expressions lambda.
map(lambda x: x.split(), a)
mais, en utilisant une compréhension de liste [x.split() for x in a]
est beaucoup plus clair dans ce cas.
Voici comment je le fais:
>>> a=['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
>>> map(str.split, a)
[['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]
Cela ne fonctionne que lorsque vous savez que vous avez une liste de str
(c'est-à-dire pas seulement une liste de choses qui implémentent la méthode split
d'une manière compatible avec str
). Il repose également sur l'utilisation du comportement par défaut de split()
, qui se divise sur n'importe quel espace, plutôt que sur x.split(' ')
, qui se divise uniquement sur les caractères d'espace (c'est-à-dire pas les tabulations, les nouvelles lignes ou d'autres espaces blancs) ), car vous ne pouvez pas passer un autre argument à l'aide de cette méthode. Pour appeler un comportement plus complexe que cela, j'utiliserais une compréhension de liste.
Réponse wiki communautaire pour comparer les autres réponses données
>>> from timeit import Timer
>>> t = {}
>>> t['methodcaller'] = Timer("map(methodcaller('split', ' '), a)", "from operator import methodcaller; a=['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']")
>>> t['lambda'] = Timer("map(lambda s: s.split(), a)", "a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']")
>>> t['listcomp'] = Timer("[s.split() for s in a]", "a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']")
>>> for name, timer in t.items():
... print '%s: %.2f usec/pass' % (name, 1000000 * timer.timeit(number=100000)/100000)
...
listcomp: 2.08 usec/pass
methodcaller: 2.87 usec/pass
lambda: 3.10 usec/pass