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]
中的项目。
这就是我所拥有的:
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]
中的项目。