python map string split list

Я пытаюсь сопоставить функцию str.split массиву строк. а именно, я хотел бы разделить все строки в массиве строк, которые соответствуют одному и тому же формату. Есть идеи, как это сделать с картой в Python? Например, предположим, что у нас есть такой список:

>>> a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']

хотите разделить строки по пробелу (split ("")), используя карту, чтобы получить список как:

>>> [['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]
31
задан Martijn Pieters 1 September 2016 в 16:00
поделиться

2 ответа

Хотя это не очень хорошо известно, есть функция, разработанная специально для этой цели, 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']]

Этот метод быстрее, чем эквивалентные подходы с использованием лямбда-выражений .

42
ответ дан 27 November 2019 в 21:45
поделиться

Сообщество вики-ответа, чтобы сравнить другие ответы даны

>>> 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
ответ дан 27 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: