从列表生成多个列表

时间:2017-10-19 12:52:38

标签: python list

附加

列表的最佳方法是什么
A = [1,2,3,4,5]

并获取此类列表;

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

5 个答案:

答案 0 :(得分:9)

只需使用切片列表理解

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

答案 1 :(得分:4)

另一个列表理解,避免过多地使用索引。

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

我认为最好的方法和最基本的方法是使用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]

答案 4 :(得分:2)

您在此处描述的是某些函数式编程语言中的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之间共享,因此我们不构造显式列表,除非我们明确地想要这样(如上例所示)。