我有四個嵌套字典:
a = {
1: {'a': 123, 'b': 222, 'c': 888},
2: {'a': 333, 'b': 555, 'c': 345}}
b = {
1: {'d': 456, 'e': 333, 'f': 333},
2: {'d': 555, 'e': 233, 'f': 433}}
c = {
1: {'g': 789, 'h': 444, 'i': 999},
2: {'g': 456, 'h': 333, 'i': 333}}
d = {
1: {'j': 111, 'k': 555, 'l': 222},
2: {'j': 456, 'k': 333, 'l': 333, 'm': 555}}
我想將它們連接/合并到一個新字典中并按主鍵分組。所需的輸出是:
result = {
1: {'a': 123, 'b': 222, 'c': 888, 'd': 456, 'e': 333, 'f': 333, 'g': 789, 'h': 444, 'i': 999, 'j': 111, 'k': 555, 'l': 222},
2: {'a': 333, 'b': 555, 'c': 345, 'd': 555, 'e': 233, 'f': 433, 'g': 456, 'h': 333, 'i': 333, 'j': 456, 'k': 333, 'l': 333, 'm': 555}}
每個字典 (a,b,c,d) 正好有 200 個主鍵(1 到 200)——我每個只顯示了 2 個條目。沒有重復的子鍵,但有時一個中的子鍵比另一個中的子鍵多(參見“d”)。
我意識到 StackOverflow 上有許多非常相似的問題,但我發現的問題似乎涉及其他問題(元組、串列、僅組合兩個字典等),而且我無法適應我的情況。考慮到我想要的結果,一個不成功的嘗試(基于類似的問題)似乎是合乎邏輯的:
result = {key: a[key] b[key] c[key] d[key] for key in a}
uj5u.com熱心網友回復:
您可以使用reduce()withdefaultdict()來構建結果。對于(外部)字典中的每個鍵,我們使用以下方法累積對應于內部字典(即鍵映射到的字典)的鍵值對reduce():
from functools import reduce
from collections import defaultdict
dictionaries = [a, b, c, d]
# Can use dict.__or__ in Python 3.9 , rather than dict(**x[k], **y[k])
result = reduce(
lambda x, y: {k: dict(**x[k], **y[k]) for k in y},
dictionaries, defaultdict(dict)
)
print(result)
這輸出:
{
1: {'a': 123, 'b': 222, 'c': 888, 'd': 456, 'e': 333, 'f': 333, 'g': 789, 'h': 444, 'i': 999, 'j': 111, 'k': 555, 'l': 222},
2: {'a': 333, 'b': 555, 'c': 345, 'd': 555, 'e': 233, 'f': 433, 'g': 456, 'h': 333, 'i': 333, 'j': 456, 'k': 333, 'l': 333, 'm': 555}
}
uj5u.com熱心網友回復:
使用|運算子將??所有子字典組合在一起:
import functools
result = {
main_key: functools.reduce(
dict.__or__,
(sub_dicts[main_key] for sub_dicts in (a, b, c, d))
)
for main_key in a
}
uj5u.com熱心網友回復:
這也是解決您問題的另一種方法
dd = {}
for k in a:
dd[k] = {**a[k], **b[k], **c[k], **d[k]}
輸出:
{1: {'a': 123,
'b': 222,
'c': 888,
'd': 456,
'e': 333,
'f': 333,
'g': 789,
'h': 444,
'i': 999,
'j': 111,
'k': 555,
'l': 222},
2: {'a': 333,
'b': 555,
'c': 345,
'd': 555,
'e': 233,
'f': 433,
'g': 456,
'h': 333,
'i': 333,
'j': 456,
'k': 333,
'l': 333,
'm': 555}}
uj5u.com熱心網友回復:
您可以使用**合并多并從中dict創建一個:dict
>>> {k: {**v, **b.get(k,{}), **c.get(k,{}), **d.get(k, {})} for k,v in a.items()}
{1: {'a': 123,
'b': 222,
'c': 888,
'd': 456,
'e': 333,
'f': 333,
'g': 789,
'h': 444,
'i': 999,
'j': 111,
'k': 555,
'l': 222},
2: {'a': 333,
'b': 555,
'c': 345,
'd': 555,
'e': 233,
'f': 433,
'g': 456,
'h': 333,
'i': 333,
'j': 456,
'k': 333,
'l': 333,
'm': 555}}
uj5u.com熱心網友回復:
您可以嘗試使用 ** 將多個字典合并在一起。
a = {
1: {'a': 123, 'b': 222, 'c': 888},
2: {'a': 333, 'b': 555, 'c': 345}}
b = {
1: {'d': 456, 'e': 333, 'f': 333},
2: {'d': 555, 'e': 233, 'f': 433}}
c = {
1: {'g': 789, 'h': 444, 'i': 999},
2: {'g': 456, 'h': 333, 'i': 333}}
d = {
1: {'j': 111, 'k': 555, 'l': 222},
2: {'j': 456, 'k': 333, 'l': 333, 'm': 555}}
result = {}
for i in range(1,len(a) 1):
l = {**a[i], **b[i], **c[i], **d[i]}
result[i] = l
print(result)
"""
{1: {'a': 123, 'b': 222, 'c': 888, 'd': 456, 'e': 333, 'f': 333, 'g': 789, 'h': 444, 'i': 999, 'j': 111, 'k': 555, 'l': 222},
2: {'a': 333, 'b': 555, 'c': 345, 'd': 555, 'e': 233, 'f': 433, 'g': 456, 'h': 333, 'i': 333, 'j': 456, 'k': 333, 'l': 333, 'm': 555}}
"""
uj5u.com熱心網友回復:
您可以簡單地在字典上使用 or 操作
一個=
{1: {'a': 123, 'b': 222, 'c': 888},
2: {'a': 333, 'b': 555, 'c': 345}}
b =
{1: {'d': 456, 'e': 333, 'f': 333},
2: {'d': 555, 'e': 233, 'f': 433}}
c =
{1: {'g': 789, 'h': 444, 'i': 999},
2: {'g': 456, 'h': 333, 'i': 333}}
d =
{1: {'j': 111, 'k': 555, 'l': 222},
2: {'j': 456, 'k': 333, 'l': 333, 'm': 555}}
結果 =
{1: a[1] | b[1] | c[1] | d[1],
2: a[2] | b[2] | c[2] | d[2]}
列印(結果)
輸出 :
{1:
{'a': 123, 'b': 222, 'c': 888, 'd': 456, 'e': 333, 'f': 333, 'g': 789, 'h': 444, 'i': 999, 'j': 111, 'k': 555, 'l': 222},2:
{'a': 333, 'b': 555, 'c': 345, 'd': 555, 'e': 233, 'f': 433, 'g': 456, 'h':333, 'i': 333, 'j': 456, 'k': 333, 'l': 333, 'm': 555}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/497564.html
