2017-10-19 87 views
2

什麼是追加的從列表中生成多個列表

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。 –

回答

8

只是一個列表理解與切片

B = [A[:i] for i in range(1, len(A) + 1)] 
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]] 
+1

也許我太快了,不好意思。正如你所說,對我來說,這個解決方案不是pythonic,然後不是'正確'(對我來說),即使是有效的。我認爲每種語言都有其「風格」,然後我們的責任就是儘量保留它。說這個,我不是'專家',也不是專家 – horro

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]] 
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] 
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之間共享,因此我們不會構造顯式列表,除非我們明確需要(如上例所示)。