簡體   English   中英

如何將兩個或多個字典合並為一個字典並保留與列表相同鍵的多個值?

[英]How to merge two or more dict into one dict with retaining multiple values of same key as list?

我有兩個或多個字典,我喜歡將它合並為一個,並保留與列表相同鍵的多個值。 我無法共享原始代碼,因此請幫助我使用以下示例。

輸入:

a= {'a':1, 'b': 2}
b= {'aa':4, 'b': 6}
c= {'aa':3, 'c': 8}

輸出:

c= {'a':1,'aa':[3,4],'b': [2,6], 'c': 8}

我建議你閱讀defaultdict :它允許你提供一個工廠方法來初始化丟失的鍵,即如果一個鍵被查找但沒有找到,它會通過調用factory_method(missing_key)來創建一個值。 看這個例子,它可能會讓事情更清楚:

from collections import defaultdict

a = {'a': 1, 'b': 2}
b = {'aa': 4, 'b': 6}
c = {'aa': 3, 'c': 8}

stuff = [a, b, c]
# our factory method is the list-constructor `list`,
# so whenever we look up a value that doesn't exist, a list is created;
# we can always be sure that we have list-values
store = defaultdict(list)

for s in stuff:
    for k, v in s.items():
        # since we know that our value is always a list, we can safely append
        store[k].append(v)

print(store)

這具有為單個出現的值創建單元素列表的“缺點”,但也許您可以解決這個問題。

請在下面找到以解決您的問題。 我希望這對你有用。

from collections import defaultdict

a = {'a':1, 'b': 2}
b =  {'aa':4, 'b': 6}
c={'aa':3, 'c': 8}

dd = defaultdict(list)

for d in (a,b,c): 
    for key, value in d.items():
        dd[key].append(value)

print(dd)

使用defaultdict自動創建一個帶有空列表的字典條目。

要在單個循環中處理所有源字典,請使用itertools.chain

主循環只是將當前項中的一個值添加到當前鍵下的列表中。

正如您所寫,對於在某個鍵下只有一個項目的情況,您必須生成一個工作字典(使用dictonary comprehension ),僅限於具有僅包含一個項目的值(列表)的項目。 此類項目的值應僅包含源列表中的第一個(也是唯一一個)數字。

然后使用這個字典來更新d

所以整個腳本可能會出奇的短,如下所示:

from collections import defaultdict
from itertools import chain
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c = {'aa':3, 'c': 8}
d = defaultdict(list)
for k, v in chain(a.items(), b.items(), c.items()):
    d[k].append(v)
d.update({ k: v[0] for k, v in d.items() if len(v) == 1 })

如您所見,實際處理代碼僅包含在 4(最后)行中。

如果打印d ,結果是:

defaultdict(list, {'a': 1, 'b': [2, 6], 'aa': [4, 3], 'c': 8})

暫無
暫無

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

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