从列表中生成多个列表
问题描述:
什么是追加的从列表中生成多个列表
A = [1,2,3,4,5]
列表,并获得这种列表的最佳方式;
B = [[1], [1, 2], [1,2,3], [1,2,3,4], [1,2,3,4,5]]
答
只是一个列表理解与切片
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
之间共享,因此我们不会构造显式列表,除非我们明确需要(如上例所示)。
你有什么尝试过自己? –
如果你想要所有可能的组合,你应该看看'itertools':https://docs.python.org/3/library/itertools.html –
@Loïc:不,他想要所有可能的inits。 –