web-dev-qa-db-fra.com

python liste de partage de chaîne de carte

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']]
34
pacodelumberg

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.

44
Raymond Hettinger

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.

26
Russell Dias

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.

7
Ben

Utilisez map conjointement avec une fonction. Une bonne façon est d'utiliser une fonction lambda :

>>> a=['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
>>> map(lambda s: s.split(), a)
[['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'],
 ['2011-12-20', '01:09:21']]
7
phihag

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
1
kojiro