簡體   English   中英

是否有任何pythonic方法來組合兩個字典(為公共值制作一個列表)?

[英]Is there any pythonic way to combine two dicts (making a list for common values)?

例如,我有兩個字典。

A = {'a':1, 'b':10, 'c':2}
B = {'b':3, 'c':4, 'd':10}

我想要這樣的結果:

{'a':1, 'b': [10, 3], 'c':[2, 4], 'd':10}

如果一個鍵出現在兩個字典中,我想列出兩個值。

我會列出所有值:

{k: filter(None, [A.get(k), B.get(k)]) for k in A.viewkeys() | B}

使用字典視圖對象

演示:

>>> A = {'a':1, 'b':10, 'c':2}
>>> B = {'b':3, 'c':4, 'd':10}
>>> {k: filter(None, [A.get(k), B.get(k)]) for k in A.viewkeys() | B}
{'a': [1], 'c': [2, 4], 'b': [10, 3], 'd': [10]}

這至少可以使您的值類型保持一致。

要生成輸出,您需要使用兩個字典之間的集合交集和對稱差異:

dict({k: [A[k], B[k]] for k in A.viewkeys() & B},
     **{k: A.get(k, B.get(k)) for k in A.viewkeys() ^ B})

演示:

>>> dict({k: [A[k], B[k]] for k in A.viewkeys() & B},
...      **{k: A.get(k, B.get(k)) for k in A.viewkeys() ^ B})
{'a': 1, 'c': [2, 4], 'b': [10, 3], 'd': 10}

在 Python 3 中, dict.keys()是一個字典視圖,因此您可以將所有.viewkeys()調用替換為.keys()以獲得相同的功能。

我會贊同 Martijn Pieters 的概念,即您可能希望結果字典中的所有值都具有相同的類型。

給出第二個選項:

您還可以使用defaultdict非常直觀地實現您的結果。

defaultdict 類似於 dict,但它有一個默認構造函數,如果鍵尚不存在,則調用該構造函數。

所以你會去:

from collections import defaultdict

A = {'a':1, 'b':10, 'c':2}
B = {'b':3, 'c':4, 'd':10}

result = defaultdict(list)

for d in [A, B]:
    for k, v in d.items():
        result[k].append(v)

然后在稍后階段,您仍然可以輕松地為結果添加更多值。

你也可以切換到

defaultdict(set)

如果你不想重復值

暫無
暫無

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

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