所以這是我: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的新手,非常感謝所有幫助!
所以這是我: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的新手,非常感謝所有幫助!
如果你不關心項目的順序,你可以使用一個基於set
方法:
last = set(lst[0])
res = [lst[0]]
for item in lst[1:]:
last &= set(item)
res.append(list(last))
這裏,res
包含所產生的名單列表。重要的一行是last &= set(item)
,它計算前一個項目和當前項目之間的交集。
你會如何從右側做這件事?我嘗試使用lst [-1]而不是lst [0],併爲循環我做了lst [: - 2:-1],但它似乎並沒有工作。 –
您將從'lst [-1]'開始,並遍歷'lst [-2 :: - 1]',它基本上反轉所有內容。 –
太棒了,謝謝!錯誤地放置在切片中的-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)
,或者直接忽略集和使用列表代替,但套的速度更快,因爲它們散列和路口是核心功能。
一號線回答:
>>> 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]
的項目。
這不是有效的Python代碼。你是否想在子列表之間加逗號? –
你應該展示你的嘗試,以表明你至少已經努力了。 –