所以这就是我所拥有的:
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的新手,所以非常感谢任何帮助!
答案 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)
,它计算前一项和当前项之间的交集。
答案 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)
或者只是忽略集合和使用列表,但是集合更快,因为它们是散列的并且交集是核心功能。
答案 2 :(得分: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
'循环中,应该将lst[:i+1]
中的项目合并。