[英]Simplify a deep dictionary in Python
我有一個相當深刻的命令,我需要簡化。 我這樣做時遇到了一些問題。
這是需要簡化的字典的一個小樣本:
data_dict = {
"DATA": {
"Page1": [{
"Section": [{
"Name": [{
"text": "John"
}],
"ID_Number": [{
"text": "123456"
}]
}]
}],
"Page2": [{
"Section": [{
"Name": [{
"text": "Rob"
}],
"ID_Number": [{
"text": "654321"
}]
}]
}]
}
}
我已經做了什么:
my_dict = {}
for value in data_dict.values():
for key, val in value.items():
if "Tab" in key:
my_dict[key] = val
if type(val) == list:
for i in val:
for key1, val1 in i.items():
my_dict[key] = val1
result_dict = {}
page_list = []
for keys, values in my_dict.items():
for val in values:
if type(val) != str:
for key1, val1 in val.items():
for x in val1:
result_dict[key1] = x.get('text')
page_list.append(result_dict)
my_dict[keys] = page_list
print("my_dict = ", my_dict)
當前結果:
my_dict = {'Page1': [{'Name': 'Rob', 'ID_Number': '654321'}, {'Name': 'Rob', 'ID_Number': '654321'}, {'Name': 'Rob', 'ID_Number': '65432
1'}, {'Name': 'Rob', 'ID_Number': '654321'}], 'Page2': [{'Name': 'Rob', 'ID_Number': '654321'}, {'Name': 'Rob', 'ID_Number': '
654321'}, {'Name': 'Rob', 'ID_Number': '654321'}, {'Name': 'Rob', 'ID_Number': '654321'}]}
問題是result_dict
被多次附加到page_list
,這是不必要的。 另外,我的方法非常混亂。 有沒有更清潔的方法來獲得相同的結果?
期望的結果:
my_dict = {"Page1": [{"Name": "John", "ID_Number": "123456"}], "Page2": [{"Name": "Rob", "ID_Number": "654321"}]}
如果你想避免太多的嵌套 for 循環。 我會利用事先知道重復鍵的優勢,並使用該信息輕松獲取內部鍵或值。
解決方案 1 和 2 的 dict 參考:
data_dict = {"DATA": {"Page1": [{"Section": [{"Name": [{"text": "John"}],"ID_Number": [{"text": "123456"}]}]}],"Page2": [{"Section": [{"Name": [{"text": "Rob"}],"ID_Number": [{"text": "654321"}]}]}]}}
代碼:
# Depth #1
old_dict = data_dict["DATA"]
new_dict = {}
for d1_key in old_dict:
d2 = old_dict[d1_key][0]["Section"][0]
for d2_key in d2:
if d2_key == "Name":
new_dict[d1_key] = [{d2_key: d2[d2_key][0]["text"]}]
if d2_key == "ID_Number":
merge = new_dict[d1_key][0]
# Merge above if statement (dict merging)
new_dict[d1_key] = [{**merge, **{d2_key:d2[d2_key][0]["text"]}}]
print(new_dict)
Output:
{'Page1': [{'Name': 'John', 'ID_Number': '123456'}], 'Page2': [{'Name': 'Rob', 'ID_Number': '654321'}]}
(推薦)這是第二種解決方案,它提供了相同的所需 output,它不利用有關鍵或值的信息,而僅查看數據的結構。 我更喜歡這個,因為它易於閱讀、修改或擴展!
代碼:
# Depth #1
old_dict = data_dict["DATA"]
new_dict = {}
unlist = 0
k3_temp = None # instead of merge
v4_temp = None
for k1, v1 in old_dict.items():
for v2 in v1[unlist].values(): # using values because we don't use the Section key
for k3, v3 in v2[unlist].items():
for k4, v4 in v3[unlist].items():
new_dict[k1] = [{k3_temp:v4_temp, k3:v4}]
k3_temp = k3
v4_temp = v4
print(new_dict)
Output:
{'Page1': [{'Name': 'John', 'ID_Number': '123456'}], 'Page2': [{'Name': 'Rob', 'ID_Number': '654321'}]}
只是為了看到另一個帶有大量for loops
的解決方案:
new_dic = {}
inner_list = []
for i in data_dict:
for j in data_dict[i]:
for k in data_dict[i][j]:
for m in k:
for n in k[m]:
for x in n:
for y in n[x]:
for keys, values in y.items():
inner_list.append(values)
new_dic[j] = [{'Name': inner_list[0], 'ID_Number': inner_list[1]}]
inner_list = []
print(new_dic)
output
{'Page1': [{'Name': 'John', 'ID_Number': '123456'}], 'Page2': [{'Name': 'Rob', 'ID_Number': '654321'}]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.