簡體   English   中英

Python:查找包含列表的兩個詞典之間的差異

[英]Python: Find difference between two dictionaries containing lists

我有兩個具有以下結構的詞典:

a = {'joe': [24,32,422], 'bob': [1,42,32,24], 'jack':[0,3,222]}
b = {'joe': [24], 'bob': [1,42,32]}

我想檢索這兩個詞典之間的區別,在這種情況下會導致:

{'joe': [32,422], 'bob': [24], 'jack':[0,3,222]}

我知道我可以通過一個凌亂的循環來做到這一點,但我想知道如何以干凈,pythonic的方式實現這一目標?

我確實嘗試過: a.items() - b.items()

但是我收到以下錯誤: unsupported operand type(s) for -: 'dict_values' and 'dict_values'

謝謝你的幫助

假設您的任何列表中都沒有重復的條目,您可以使用set而不是列表執行所需的操作:

>>> a = {'joe': [24,32,422], 'bob': [1,42,32,24], 'jack':[0,3,222]}
>>> b = {'joe': [24], 'bob': [1,42,32]}
>>> {key: list(set(a[key])- set(b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}

注意兩件事:

  • 當我將它設置為值時,我將該集轉換回列表
  • 我使用b.get而不是b[key]來處理如果b中不存在鍵,但是在a

編輯 - 使用for循環:

我意識到理解可能不是那么自我解釋所以這是使用for循環的等效代碼:

>>> c = {}
>>> for key in a:
    c[key] = list(set(a[key]) - set(b.get(key,[])))


>>> c
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}

編輯 - 失去第二集:

正如Padraic Cunningham在評論中提到的那樣(他經常這樣做,祝福他的靈魂),你可以利用set.difference來避免明確地將你的第二個列表轉換為集合:

>>> c = {}
>>> for key in a:
    c[key] = list(set(a[key]).difference(b.get(key,[])))


>>> c
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}

或列表理解:

>>> {key: list(set(a[key]).difference(b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}

或者如果要將set.difference視為類方法而不是實例方法:

>>> {key: list(set.difference(set(a[key]),b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}

雖然我覺得這有點笨重但我不太喜歡它。

你需要使用集合:

diff = {}
for key in a:
    diff[key] = list(set(a[key]) - set(b.get(key, [])))
print diff

另一種方法是使用內置方法filter

>>> a = {'joe': [24,32,422], 'bob': [1,42,32,24], 'jack':[0,3,222]}
>>> b = {'joe': [24], 'bob': [1,42,32]}
>>> {key:filter(lambda s: s not in b.get(key,[]), a[key]) for key in a}
{'bob': [24], 'joe': [32, 422], 'jack': [0, 3, 222]}

根據Padraic Cunningham評論:

在Python 3中, filter返回一個generator ,因此,您需要將它轉換為列表,這樣:

{key:list(filter(lambda s: s not in b.get(key,[]), a[key])) for key in a}

暫無
暫無

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

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