我有這個嵌套字典(“字典字典”)
source = {
"OuterVal0": {"InnerVal": [10, 21, 96],"InnerVal2": [100, 91, 71]},
"OuterVal1": {"InnerVal": [21, 19, 76],"InnerVal2": [1, 1, 1]},
"OuterVal2": {"InnerVal": [1, 1, 96],"InnerVal2": [10, 9, 7]},
"OuterVal3": {"InnerVal": [0, 2, 6],"InnerVal2": [1, 911, 718]},
"OuterVal4": {"InnerVal": [12, 13, 9],"InnerVal2": [1000, 910, 701]},
"OuterVal5": {"InnerVal": [110, 211, 961],"InnerVal2": [10, 911, 918]},
}
我想創建一個新的,它由與內部值關聯的外部鍵組成(見下面的預期輸出)我使用這個遞回函式:
def myPrint(d, key=""):
output = {}
for k, v in d.items():
i = 0
if isinstance(v, dict):
return myPrint(v, k)
else:
for value in d.values():
newkey = (f"{i}_{key}")
output[newkey] = value
i = 1
return output
但是當我嘗試列印時:
print(myPrint(source))
我明白了(只處理第一個字典:
# {'0_OuterVal0': [10, 21, 96], '1_OuterVal0': [100, 91, 71]}
但我想要這樣的東西(所有字典都已處理)
"""
Expected output
{'0_OuterVal0': [10, 21, 96], '1_OuterVal0': [100, 91, 71]}
{'0_OuterVal1':[21, 19, 76], '1_OuterVal1': [1, 1, 1]}
.
.
.
{'0_OuterVal5': [110, 211, 961], '1_OuterVal5': [10, 911, 918]}
"""
我究竟做錯了什么?
非常感謝您的任何幫助。
uj5u.com熱心網友回復:
問題是,當您 return myPrint(v, k)第一次呼叫時,您計算第一個字典的值,然后回傳而不是繼續 for 回圈中的其他值。
將功能更改為:
def myPrint(d, key=""):
output = {}
for k, v in d.items():
i = 0
if isinstance(v, dict):
output.update(myPrint(v, k))
else:
for value in d.values():
newkey = (f"{i}_{key}")
output[newkey] = value
i = 1
return output
將回傳一個大字典,例如:
{'0_OuterVal0': [10, 21, 96], '1_OuterVal0': [100, 91, 71],
'0_OuterVal1': [21, 19, 76], '1_OuterVal1': [1, 1, 1],
'0_OuterVal2': [1, 1, 96], '1_OuterVal2': [10, 9, 7],
'0_OuterVal3': [0, 2, 6], '1_OuterVal3': [1, 911, 718],
'0_OuterVal4': [12, 13, 9], '1_OuterVal4': [1000, 910, 701],
'0_OuterVal5': [110, 211, 961], '1_OuterVal5': [10, 911, 918]}
但是,該函式可以以非遞回方式很好地打包,如下所示:
output = [{f'{ii}_{k}': vv for (k, v) in source.items() for ii, (kk, vv) in enumerate(v.items())}]
uj5u.com熱心網友回復:
您可以更簡單地作為串列理解獲得所需的輸出:
output = [{f'0_OuterVal{i}': v['InnerVal'], f'1_OuterVal{i}': v['InnerVal2']}
for i, (k, v) in enumerate(source.items())]
這將使用您指定的鍵和值創建一個字典串列。
uj5u.com熱心網友回復:
使用除錯器逐步執行代碼將對您有所幫助:
當您呼叫myPrint(source)并進入 for 回圈時,您確實遞回地呼叫了您的函式,但是您沒有將第一個嵌套字典添加到您的輸出中,而是使用return關鍵字。所以回傳使用第一個鍵創建的字典,這就是你的函式的結尾。
如果你的函式的目的是列印,并且你想保留你的原始代碼結構,你可以使用這個:
def myPrint(d, key=""):
output = {}
lines = ""
for k, v in d.items():
i = 0
if isinstance(v, dict):
lines = str(myPrint(v, k)) '\n'
else:
for value in d.values():
newkey = (f"{i}_{key}")
output[newkey] = value
i = 1
return output if lines == "" else lines
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/456550.html
上一篇:如何用YAML配置表示使用工廠的引數,相當于這個XML配置?
下一篇:我可以將CancellationTokenSource.Cancel和CancellationTokenSource.CancelAfter(timeSpan)用于同一任務嗎?
