我正在研究列表的差异.
>>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)
(后者可能更可取.)
那这个呢:
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)
此方法接受任意数量的列表