我有 n 個非常復雜的 Python 字典,深度級別很大(~5),我不知道如何正確快速地合并它們,而不是迭代它們一百萬次。
值得一提的是 - dicts 具有嚴格的結構,如下所示。
我正在嘗試與以下相關的解決方案:
- 默認字典
- 合并運算子
Python 版本 - 3.9
d1 = {
"name": "Louis",
"places": [
{
"code": "A",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
}
d2 = {
"name": "Louis",
"places": [
{
"code": "B",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
}
d3 = {
"name": "Louis",
"places": [
{
"code": "A",
"subplaces": [
{
"name": "Subplace name X",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
}
在這種情況下,輸出應該是
d_merged = {
"name": "Louis",
"places": [
{
"code": "A",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name X",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
},
{
"code": "B",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
}
uj5u.com熱心網友回復:
您的任務非常具體,因此不可能有通用的解決方案。我建議您合并嵌套字典中的所有"places"、"subplaces"和"subsubplaces"以清除所有可能的重復項,然后修改資料以匹配所需的格式。
from itertools import groupby
from operator import itemgetter
from collections import defaultdict
def merge_places(*dicts):
if not dicts:
return
# check all dicts have same names
# https://docs.python.org/3/library/itertools.html#itertools-recipes
g = groupby(dicts, itemgetter("name"))
if next(g, True) and next(g, False):
raise ValueError("Dictionaries names are not equal")
places = defaultdict(lambda: defaultdict(set)) # set values are unique
for d in dicts:
for place in d["places"]:
for subplace in place["subplaces"]:
for subsubplace in subplace["subsubplaces"]:
places[place["code"]][subplace["name"]].add(subsubplace["name"])
return {
"name": d["name"], # always exists as dicts aren't empty
"places": [
{
"code": code,
"subplaces": [
{
"name": name,
"subsubplaces": [
{"name": subsubplace}
for subsubplace in subsubplaces
]
}
for name, subsubplaces in subplaces.items()
]
}
for code, subplaces in places.items()
]
}
用法:
result = merge_places(d1, d2, d3)
輸出:
{
"name": "Louis",
"places": [
{
"code": "A",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name X",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
},
{
"code": "B",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
}
你可以幫助我的國家,查看我的個人資料資訊。
uj5u.com熱心網友回復:
我認為你的資料表示有很多不必要的細節,我們可以通過這個解決方案減少它們:
from typing import Dict, List
dicts = [
{
"name": "Louis",
"places": [
{
"code": "A",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
},
{
"name": "Louis",
"places": [
{
"code": "B",
"subplaces": [
{
"name": "Subplace name",
"subsubplaces": [
{
"name": "subsub1"
}
]
},
{
"name": "Subplace name2",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
},
{
"name": "Louis",
"places": [
{
"code": "A",
"subplaces": [
{
"name": "Subplace name X",
"subsubplaces": [
{
"name": "subsub1"
}
]
}
]
}
]
}]
def merger(dicts: List[Dict]) -> Dict:
result = {}
for d in dicts:
name = d["name"]
if not name in result:
result[name] = {}
places = d["places"]
for p in places:
code = p["code"]
if not code in result[name]:
result[name][code] = []
result[name][code].extend(p["subplaces"])
return result
print(merger(dicts=dicts))
輸出將是:
{
'Louis':{
'A':[
{'name': 'Subplace name', 'subsubplaces': [{'name': 'subsub1'}]},
{'name': 'Subplace name2', 'subsubplaces': [{'name': 'subsub1'}]},
{'name': 'Subplace name X', 'subsubplaces': [{'name': 'subsub1'}]}
],
'B':[
{'name': 'Subplace name', 'subsubplaces': [{'name': 'subsub1'}]},
{'name': 'Subplace name2', 'subsubplaces': [{'name': 'subsub1'}]}]
}
}
如果你想要你想要的輸出,很容易將這個更改為你想要的輸出,但是這個更可讀和可維護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441347.html
上一篇:檢查字典是否在字典串列中匹配,如果匹配,則添加值True或False
下一篇:獲取字典中3個最小值對應的鍵
