Python:如何在迭代列表时仅保留所有先前子列表中的元素?

时间:2016-01-03 23:14:50

标签: python list loops integer list-comprehension

所以这就是我所拥有的:

 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的新手,所以非常感谢任何帮助!

3 个答案:

答案 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]中的项目合并。