簡體   English   中英

Python列表差異與出現次數

[英]Python list difference with number of ocurrences

是否有Python內置的列表減法/列表差異功能? 我知道如何編寫這樣的函數,因此無需解釋。 但是由於這是很常見的事情,所以我想知道是否已經內置了這樣的功能。

我有兩個排序列表,每個列表可能包含相同元素的多個副本。

考慮到出現的次數,我想知道列表之間的區別是什么(設置的區別是不夠的)

例如:

l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]

diff (l1, l2) 
[1,3,5,6]

diff (l2,l1)
[8,9]

也許您可以只使用Counter類。


例:

l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]
from collections import Counter

print Counter(l1) - Counter(l2)
print Counter(l2) - Counter(l1)

結果:

計數器({1:1,3:1,1,5:1,6:1})
計數器({8:1,9:1})


編輯:

要從Counter對象獲取列表,可以使用以下代碼:

from itertools import chain
r = Counter(l2) - Counter(l1)
list(chain(*[p*[k] for k,p in r.items()]))

我只是從類似於字典的Counter創建列表列表,然后使用list(chain(* ... ))將其展平為單個列表。

我認為BigYellowCactus的解決方案是完美的。 我只想添加一個如何將Counter擴展回列表:

>>> from itertools import chain
>>> from collections import Counter
>>> a=[1,1,1,1,1,2,3,4,2,2]
>>> b=[1,1,1,2,3]
>>> list(chain(*[[k]*v for (k,v) in (Counter(a)-Counter(b)).items()]))
[1, 1, 2, 2, 4]

使用集

l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]

def  diff (list1, list2) :
    return list(set(list1).difference(set(list2)))

print diff(l1,l2)

>>> 
[3, 5, 6]

我目前正在使用此:

def listdiff (l1, l2):
    for x in l1:
        if x in l2:
            l1.remove(x)
            l2.remove(x)
    return l1

暫無
暫無

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

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