Python: 如何在遍历列表时只保留所有先前子列表中的元素?

Python: How to only retain elements from all previous sublists while iterating over list?

这就是我所拥有的:

 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),它计算前一个项目和当前项目之间的交集。

您可以使用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 的第一个循环中,应该合并 lst[:i+1] 中的项目。