我正在处理列表的差异。
>>a = [1, 2, 3]
>>b = [2, 4, 5]
>>c = [3, 2, 6]
使用以下方法可以计算两个集合的对称差:
>>z = set(a).symmetric_difference(set(b))
>>print z
>>set([1, 3, 4, 5])
如何获取3个集合之间的差异? 对于3个集合的差异,期望的输出为:
expected output : set([1, 3, 4, 5, 6])
我正在处理列表的差异。
>>a = [1, 2, 3]
>>b = [2, 4, 5]
>>c = [3, 2, 6]
使用以下方法可以计算两个集合的对称差:
>>z = set(a).symmetric_difference(set(b))
>>print z
>>set([1, 3, 4, 5])
expected output : set([1, 3, 4, 5, 6])
只需从并集中减去交集:
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])
或者,为了概括任意集合的情况:
In [10]: l = [a, b, c]
In [11]: reduce(set.union, l) - reduce(set.intersection, l)
Out[11]: set([1, 3, 4, 5, 6])
或者:In [13]: set.union(*l) - set.intersection(*l)
Out[13]: set([1, 3, 4, 5, 6])
(后者可能更可取.)
a & b & c
。 - NPEl
不需要被重复使用,你可以得到:set().union(*l) - set(l.pop()).intersection(*l)
或者如果需要, i = iter(l); set().union(*l) - set(next(i)).intersection(*i)
。 - Jon Clementsiter
و›´و”¹ن¸؛next(i, ())
ن»¥ه¤„çگ†ç©؛çڑ„l
م€‚ - Jon Clementsdef difflists(*lists):
sets = map(set, lists)
return set.union(*sets) - set.intersection(*sets)
print difflists(a, b, c) # set([1, 3, 4, 5, 6])
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]
>>> a = [1, 2, 3]
>>> b = [2, 4, 5]
>>> c = [3, 2, 6]
>>> z1 = set(a).symmetric_difference(set(b))
>>> z2 = set(b).symmetric_difference(set(c))
>>> print z1.union(z2)
set([1, 3, 4, 5, 6])
@NPE的回答并没有按预期工作,因为它依赖于前面操作的结果。在您的例子中,您可以看到“3”从第一次到第三次重叠,但仍然包含在结果中。
>>> a = set(('a','b','c'))
>>> b = set(('c','d','e'))
>>> c = set(('e','f','g'))
>>> (a | b | c) - (a & b & c)
set(['a', 'c', 'b', 'e', 'd', 'g', 'f'])
>>> (a | b | c) - ((a & b) | (a & c) | (b & c))
set(['a', 'b', 'd', 'g', 'f'])
>>> ((a ^ b) | c) - ((a & c) | (b & c))
set(['a', 'b', 'd', 'g', 'f'])