从列表中生成多个列表

问题描述:

什么是追加的从列表中生成多个列表

A = [1,2,3,4,5] 

列表,并获得这种列表的最佳方式;

B = [[1], [1, 2], [1,2,3], [1,2,3,4], [1,2,3,4,5]] 
+3

你有什么尝试过自己? –

+0

如果你想要所有可能的组合,你应该看看'itertools':https://docs.python.org/3/library/itertools.html –

+0

@Loïc:不,他想要所有可能的inits。 –

只是一个列表理解与切片

B = [A[:i] for i in range(1, len(A) + 1)] 

A = [1,2,3,4,5] 

B = [] 

for x in range(1,len(A)+1): 
    B.append(list(A[0:x])) 

print(B) 

输出:

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]] 
+1

也许我太快了,不好意思。正如你所说,对我来说,这个解决方案不是pythonic,然后不是'正确'(对我来说),即使是有效的。我认为每种语言都有其“风格”,然后我们的责任就是尽量保留它。说这个,我不是'专家',也不是专家 – horro

而且避免与指数打太多另一个列表理解。

A = [1,2,3,4,5] 

B = [A[:i+1] for i, _ in enumerate(A)] 
print(B) # [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]] 

我认为最好的方法和最基本的方法是使用List Comprehensions

A = [1,2,3,4,5] 
B = [A[:i+1] for i in range(len(A))] 
print B 

输出:

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]] 

通过为您在上面给的例子的方式,即使这将工作:

B = [A[:i] for i in A] 

您在这里描述的是什么的一些函数式编程知语言为inits

如下,我们可以构造一个inits功能上的无限发电机和懒加载工作:

from itertools import islice 

def inits(xs): 
    ls = [] 
    for i,x in enumerate(xs,1): 
     ls.append(x) 
     yield islice(ls,i) 

对于你的情况,我们就可以进行map(list,...),也对结果进行list(..)

>>> list(map(list,inits(A))) 
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]] 

该appraoch的优点是它可以与无限生成器一起使用,也可以与枚举集合一起使用,但不支持切片。此外,内存在不同的islice之间共享,因此我们不会构造显式列表,除非我们明确需要(如上例所示)。