Python 如何从任意数量的元素列表中获得列表理解中的平面列表?

Python 如何从任意数量的元素列表中获得列表理解中的平面列表?,python,Python,我有这样的想法: [e for e in ([n for n in xrange(random.randrange(1, 5))] for x in xrange(10))] 它产生: [[0, 1, 2, 3], [0, 1, 2], [0], [0], [0, 1], [0], [0, 1], [0, 1, 2, 3], [0, 1, 2], [0, 1, 2]] 我需要同样的,但在平面结构 现在我用的是: l = [] [l.extend(e) for e in ([n for n i

我有这样的想法:

[e for e in ([n for n in xrange(random.randrange(1, 5))] for x in xrange(10))]
它产生:

[[0, 1, 2, 3], [0, 1, 2], [0], [0], [0, 1], [0], [0, 1], [0, 1, 2, 3], [0, 1, 2], [0, 1, 2]]
我需要同样的,但在平面结构

现在我用的是:

l = []
[l.extend(e) for e in ([n for n in xrange(random.randrange(1, 5))] for x in xrange(10))]

但是,在理解中实现任意长度列表的“解包”是否有一些不太困难的地方呢?

在一般情况下,展平任意长度列表的最佳方法是:


也就是说,在这种情况下,最好通过以下方式避免额外的工作。

使用此列表:

In [8]: [y for x in xrange(10) for y in xrange(random.randrange(1, 5))]
Out[8]: [0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 0, 1, 2, 3, 0, 0, 1, 0]
上述列表理解相当于此(但LC要快得多):

您可以使用:

然后,
打印结果
给出:

[0,1,2,3,0,1,2,0...]

链(*l)中
*
的使用受此问题启发

+1-这里最好的选择是按照您想要的方式制作,而不是在之后将其展平。+1我不知道什么时候可以将for循环嵌套到list comprehensionxrange中,random只是为了举例说明!我的案例要求从数据源弹出的元素是任意长度的lists@GillBates
对于xrange中的y(random.randrange(1,5))
迭代该任意长度列表以返回平坦列表。迭代并生成该列表,在我的例子中,我当然不会在列表理解中生成数据,这比设计用于更高效地生成数据的
itertools.chain.from\u iterable()
要慢
In [9]: lis=[]

In [10]: for x in xrange(10):
   ....:     for y in xrange(random.randrange(1, 5)):
   ....:         lis.append(y)
   ....:         
import numpy as np
l = [e for e in ([n for n in xrange(random.randrange(1, 5))] for x in xrange(10))]
a = np.asarray(l)
l = list(a.flatten(l))
print l
import itertools
l = [e for e in ([n for n in xrange(random.randrange(1, 5))] for x in xrange(10))]
result = list(itertools.chain(*l))
[0,1,2,3,0,1,2,0...]