2 回答

TA貢獻1890條經驗 獲得超9個贊
首先,讓我們重命名input為不覆蓋內置函數的名稱:
data = {
'f1': {
'l1': { 'k1': 1.6, 't1': 1.4 },
'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3 }
}
}
每個字典都有許多方法,可讓您迭代鍵、值或兩者:分別為keys、values和items。事實上,字典本身是可迭代的。在第一次嵌套時,您不關心特征名稱或級別名稱:
for feature in data.values():
for level in feature.values():
t1接下來,讓我們從每個嵌套級別獲取乘數:
multiplier = level.get('t1', 1.0)
現在您正在對每個鍵集進行操作,因此您必須注意正確過濾。如果您嘗試在迭代時進行修改level,則會遇到問題,因此讓我們迭代鍵列表的副本,并就地修改:
for key in list(level.keys()):
if key.startswith('k'):
level['geo_' + key] = level[key] * multiplier
另一種過濾鍵的方法是在循環中使用理解。例如,如果您允許鍵名以 , 以外的其他字母開頭k,并且只想省略t1:
for key in [k for k in level if k != 't1']:
level['geo_' + key] = level[key] * multiplier
整個事情結合起來:
for feature in data.values():
for level in feature.values():
multiplier = level.get('t1', 1.0)
for key in [k for k in level if k != 't1']:
level['geo_' + key] = level[key] * multiplier

TA貢獻1820條經驗 獲得超3個贊
在您的內部循環中,檢查密鑰是否以k. 如果是,則執行乘法并創建相應的geo_kX密鑰。
for k1, v1 in input.items():
for k2, v2 in v1.items():
for k3, v3 in list(v2.items()):
if k3.startswith('k'):
v2['geo_' + k3] = v2['t1'] * v3
有必要使用list(v2.items())來避免錯誤:
RuntimeError:字典在迭代期間改變了大小
添加回答
舉報