python map字符串拆分列表

时间:2011-12-11 01:19:11

标签: python string parsing functional-programming

我正在尝试将str.split函数映射到字符串数组。也就是说,我想将字符串数组中的所有字符串拆分为相同的格式。知道如何在python中使用map吗?例如,我们假设我们有一个这样的列表:

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

希望使用map将空格(split(“”))拆分为一个列表:

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

5 个答案:

答案 0 :(得分:38)

虽然它并不为人所知,但有一个专为此目的而设计的功能,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']]

这种技术比使用lambda表达式的等效方法更快。

答案 1 :(得分:22)

map(lambda x: x.split(), a)但是,在这种情况下,使用列表推导[x.split() for x in a]会更加清晰。

答案 2 :(得分:7)

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

答案 3 :(得分:7)

我就是这样做的:

>>> 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(' '),它只分割空格字符(即不是制表符,换行符或其他空格),因为你不能使用此方法传递另一个参数。对于比这更复杂的调用行为,我会使用列表推导。

答案 4 :(得分:1)

社区维基回答比较其他答案

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