簡體   English   中英

獲得3個列表之間的差異

[英]get difference between 3 lists

我正在研究列表的差異。

>>a = [1, 2, 3]
>>b = [2, 4, 5]
>>c = [3, 2, 6]

2組之間的對稱差異可以使用:

>>z = set(a).symmetric_difference(set(b))
>>print z
>>set([1, 3, 4, 5])

如何獲得3套之間的差異? 對於3組的差異,預期輸出為:

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 = [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])

那這個呢:

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])

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

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]

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

@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 | 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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM