查找在某些但不是所有列表中出现的元素

时间:2016-02-10 20:00:16

标签: python

假设我有几个整数列表,如下所示:

[0,3,4]
[2,3,4,7]
[2,3,4,6]

什么是最有效/最pythonic的方法来构建至少一个列表中但不会出现在所有列表中的所有元素的单个列表?在这种情况下,它将是

[0,2,7,6]

3 个答案:

答案 0 :(得分:6)

答案隐含在你的问题中..如果你替换"设置"为"列表"。正如StephenTG发布的那样,只需获得联合与所有列表交集的区别。

使用Counter上的集合的好处是,您不需要对每个列表中只出现一次的值做出假设。

无论您拥有多少个列表,以下内容都有效:

> list_of_sets = [set(l) for l in lists]
> set.union(*list_of_sets) - set.intersection(*list_of_sets)
{0, 2, 6, 7}

答案 1 :(得分:4)

您可以将所有列表的交集作为集合,并将所有列表的并集作为集合,并将并集中的所有元素都放在交集中。有unionintersectiondifference方法来处理这些文档here

>>> union_set = set(l1).union(l2,l3)
>>> intersection_set = set(l1).intersection(l2,l3)
>>> union_set - intersection_set
set([0, 2, 6, 7])

或者,正如kdopen的答案所示,如果您不知道要处理的列表的确切数量,您可以创建一个集合列表

答案 2 :(得分:4)

如果我们假设每个列表最多包含一个元素,那么您可以使用计数器来计算每个元素的出现次数。然后,您可以选择与输入列表的数量不同的元素:

from itertools import chain
from collections import Counter

lists = [
    [0, 3, 4],
    [2, 3, 4, 7],
    [2, 3, 4, 6]
]

print [x for x, c in Counter(chain(*lists)).items() if c != len(lists)]

结果:

[0, 2, 6, 7]