[英]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.