разделенный список строк карты Python - PullRequest
28 голосов
/ 11 декабря 2011

Я пытаюсь отобразить функцию 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']]

Ответы [ 5 ]

39 голосов
/ 11 декабря 2011

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

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

22 голосов
/ 11 декабря 2011

map(lambda x: x.split(), a) но с использованием понимания списка [x.split() for x in a] в этом случае гораздо понятнее.

7 голосов
/ 12 декабря 2011

Вот как я это делаю:

>>> 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(' '), которое разделяется только на пробельные символы (т. Е. Не табуляции, новые строки или другие пробелы), потому что вы не можете передать другой аргумент, использующий этот метод. Для вызова поведения более сложного, чем это, я бы использовал понимание списка.

7 голосов
/ 11 декабря 2011

Используйте map в сочетании с функцией. Оптимальный способ - использовать функцию лямбда :

>>> 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']]
1 голос
/ 11 декабря 2011

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

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...