ima*_*453 3 python list-comprehension list
我想知道是否有一个好的pythonic方法来打破这个列表:
['1,2,3', '22', '33']
Run Code Online (Sandbox Code Playgroud)
进入清单:
['1','2','3','22','33']
Run Code Online (Sandbox Code Playgroud)
使用列表理解?
使用列表理解,它看起来像这样:
>>> L = ['1,2,3', '22', '33']
>>> [x for l in L for x in l.split(",")]
['1', '2', '3', '22', '33']
Run Code Online (Sandbox Code Playgroud)
注意:有更清晰和更好的方法,这已经发布在其他答案中(itertools链或生成器表达式都很好).但是由于问题是关于列表理解语法的问题,我认为无论如何我都会将其写入.
由于已经使用该sum()函数作为解决方案发布了两个答案,我认为我将使用itertools.chain再贡献一个方法.
from itertools import chain
x = ['1,2,3', '22', '33']
result = chain.from_iterable(i.split(',') for i in x)
print result
#<itertools.chain object at 0x1004b5e10>
Run Code Online (Sandbox Code Playgroud)
链命令的结果是生成器.所以你可以循环结果,或者将它转换为另一个序列类型(元组,列表,集合,......)
我不会使用sum,因为它会重复连接并创建大量副本.我会这样做:
>>> import itertools
>>> l = ['1,2,3', '22', '33']
>>> list(itertools.chain.from_iterable(s.split(',') for s in l))
['1', '2', '3', '22', '33']
Run Code Online (Sandbox Code Playgroud)
对于非常短的列表,它确实稍微慢一些:
>>> %timeit sum((s.split(',') for s in l), [])
100000 loops, best of 3: 2.38 us per loop
>>> %timeit list(itertools.chain.from_iterable(s.split(',') for s in l))
100000 loops, best of 3: 3.51 us per loop
Run Code Online (Sandbox Code Playgroud)
但对于长的列表,它的方法比使用速度更快sum:
>>> l = ['1,2,3', '22', '33'] * 500
>>> %timeit sum((s.split(',') for s in l), [])
100 loops, best of 3: 6.22 ms per loop
>>> %timeit list(itertools.chain.from_iterable(s.split(',') for s in l))
1000 loops, best of 3: 664 us per loop
Run Code Online (Sandbox Code Playgroud)
实际上,我更喜欢wim的回答.快速测试显示它在所有情况下都是最快的:
>>> l = ['1,2,3', '22', '33']
>>> %timeit [x for s in l for x in s.split()]
1000000 loops, best of 3: 1.45 us per loop
>>> l = ['1,2,3', '22', '33'] * 500
>>> %timeit [x for s in l for x in s.split()]
1000 loops, best of 3: 559 us per loop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |