使用列表解析细分此列表

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)

使用列表理解?

wim*_*wim 7

使用列表理解,它看起来像这样:

>>> 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链或生成器表达式都很好).但是由于问题是关于列表理解语法的问题,我认为无论如何我都会将其写入.


jdi*_*jdi 5

由于已经使用该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)

链命令的结果是生成器.所以你可以循环结果,或者将它转换为另一个序列类型(元组,列表,集合,......)

  • 您也可以使用`chain.from_iterable()`而不是`chain(*...)`.更明确的东西...... (4认同)
  • 事实上,@ stranac不只是一个明确的问题; `*`运算符将生成器转换为元组,从而无法使用它. (2认同)

sen*_*rle 5

我不会使用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)