获得3个列表之间的差异

sam*_*sam 6 python list set

我正在研究列表的差异.

>>a = [1, 2, 3]
>>b = [2, 4, 5]
>>c = [3, 2, 6]
Run Code Online (Sandbox Code Playgroud)

2组之间的对称差异可以使用:

>>z = set(a).symmetric_difference(set(b))
>>print z
>>set([1, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

如何获得3套之间的差异?对于3组的差异,预期输出为:

expected output : set([1, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 13

只需从联合中减去交集:

In [1]: a = set([1, 2, 3])

In [2]: b = set([2, 4, 5])

In [3]: c = set([3, 2, 6])

In [4]: (a | b | c) - (a & b & c)
Out[4]: set([1, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

或者,推广到任意集合集合:

In [10]: l = [a, b, c]

In [11]: reduce(set.union, l) - reduce(set.intersection, l)
Out[11]: set([1, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

要么:

In [13]: set.union(*l) - set.intersection(*l)
Out[13]: set([1, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

(后者可能更可取.)


enr*_*cis 5

那这个呢:

def difflists(*lists):
    sets = map(set, lists)
    return set.union(*sets) - set.intersection(*sets)

print difflists(a, b, c)    # set([1, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

如果要排除多次出现的元素:

from itertools import chain
from collections import Counter

def difflists(*lists):
    items = Counter(it for lst in lists for it in lst)
    return [it for it, count in items.iteritems() if count == 1]

print difflists(a, b, c)    # [1, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

此方法接受任意数量的列表