2016-01-03 23 views
2

所以這是我:Python:如何在迭代列表時只保留所有以前的子列表中的元素?

lst = [[1,4,5,9], [4,5,7,9], [6,2,9], [4,5,9], [4,5]] 

我想打一個新的列表,其中子列表只能是與以前所有的子列表共享的元素。

它應該是這樣的:

new_lst = [[1,4,5,9], [4,5,9], [9], [9], []] 

我試圖轉換整數轉換爲字符串並遍歷它,但我似乎無法得到正確的結果。我是python的新手,非常感謝所有幫助!

+2

這不是有效的Python代碼。你是否想在子列表之間加逗號? –

+0

你應該展示你的嘗試,以表明你至少已經努力了。 –

回答

4

如果你不關心項目的順序,你可以使用一個基於set方法:

last = set(lst[0]) 
res = [lst[0]] 
for item in lst[1:]: 
    last &= set(item) 
    res.append(list(last)) 

這裏,res包含所產生的名單列表。重要的一行是last &= set(item),它計算前一個項目和當前項目之間的交集。

+0

你會如何從右側做這件事?我嘗試使用lst [-1]而不是lst [0],併爲循環我做了lst [: - 2:-1],但它似乎並沒有工作。 –

+0

您將從'lst [-1]'開始,並遍歷'lst [-2 :: - 1]',它基本上反轉所有內容。 –

+0

太棒了,謝謝!錯誤地放置在切片中的-2。 –

2

您可以使用accumulate

from itertools import accumulate 
new_lst = map(list,accumulate(map(set,lst), set.intersection)) 
print(list(new_lst)) 

產生

[[1, 4, 5, 9], [4, 5, 9], [9], [9], []] 

,但它並不能保證子列表的項目將在相同的順序。

萬一你關心的項目的順序,你可以做手工

last = set(lst[0]) 
new_lst = [lst[0]] 
for l in lst[1:]: 
    new_els = [n for n in l if n in last] 
    new_lst.append(new_els) 
    last &= set(new_els) 

print(new_lst) 

,或者直接忽略集和使用列表代替,但套的速度更快,因爲它們散列和路口是核心功能。

+0

請看到我的編輯答案一個更好的解決方案 – Pynchia

+0

我喜歡這樣的解決方案,但我認爲它不會保留在子列表中的項目的順序,因爲它也使用了一套互動。 –

+0

是真的,我現在糾正它 – Pynchia

0

一號線回答:

>>> from functools import reduce # for forward compatible. 
>>> lst = [[1,4,5,9], [4,5,7,9], [4,5,7,9], [4,5,9], [4,5]] 
>>> [list(reduce(lambda x,y: set(x)&set(y), lst[:i+1])) for i in range(len(lst))] 
[[1, 4, 5, 9], [9, 4, 5], [9], [9], []] 

的解釋:

[1, 4, 5, 9] = list(set([1, 4, 5, 9])) 
[9, 4, 5] = list(set([1, 4, 5, 9]) & set([4,5,7,9])) 
[9] = list(set([1, 4, 5, 9]) & set([4,5,7,9]) & set([4,5,7,9])) 
... 
i「ST循環

,它應該是工會lst[:i+1]的項目。

相關問題