亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

動態嵌套字典訪問

動態嵌套字典訪問

鳳凰求蠱 2023-06-06 17:25:49
我有以下格式的字典:input = {    'f1': {        'l1': { 'k1': 1.6, 't1': 1.4 },        'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3 }    }}字典的層級為:feature->level->{key=key,value=number}對于每個功能的每個級別,鍵的值(k1, k2, k3, ...)應乘以 的值't1',結果應添加回鍵下的字典"geo_" + key。例子:只有l1一個鍵 ( k1) 可用,所以輸出geo_k1 = k1 * t1; 而其中l2有兩個鍵(k1& k2),所以會有兩個輸出:geo_k1 = k1 * t1& geo_k2 = k2 * t1。預期輸出:output = {    'f1': {        'l1': { 'k1': 1.6, 't1': 1.4, 'final_k1': 2.24 },        'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3, 'final_k1': 1.95, 'final_k2': 2.34 }    }}我嘗試使用以下代碼,但不確定如何使其動態化:for k, v in input.items():    for key, value in v.items():        print(value[l1]['k1'] * value[l1]['t1'])
查看完整描述

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


查看完整回答
反對 回復 2023-06-06
?
DIEA

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:字典在迭代期間改變了大小


查看完整回答
反對 回復 2023-06-06
  • 2 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號