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