Список рассылки строки python
Я пытаюсь сопоставить функцию str.split
с массивом строки. а именно, я хотел бы разбить все строки в массиве строк, которые следуют в том же формате. Любая идея, как это сделать с map
в 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']]
Ответы
Ответ 1
Хотя это не так хорошо известно, существует функция, разработанная именно для этой цели, 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']]
Этот метод быстрее, чем эквивалентные подходы с использованием лямбда-выражений.
Ответ 2
map(lambda x: x.split(), a)
, но, используя понимание списка [x.split() for x in a]
, в этом случае гораздо яснее.
Ответ 3
Используйте map
в сочетании с функцией. Оптимальным способом является функция 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']]
Ответ 4
Вот как я это делаю:
>>> 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']]
Это работает только тогда, когда вы знаете, что у вас есть список str
(т.е. не только список вещей, реализующих метод split
, совместимый с str
). Он также полагается на использование поведения по умолчанию split()
, который разбивается на любые пробелы, а не на использование x.split(' ')
, который разбивается только на символы пробела (т.е. Не табуляции, строки новой строки или другие пробелы), потому что вы не можете пройти другой аргумент с использованием этого метода. Для более сложного поведения вызова я бы использовал понимание списка.
Ответ 5
Ответ сообщества wiki для сравнения других полученных ответов
>>> 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