需要幫助重新映射鍵是否與ind2的值匹配。如果有不匹配的鍵,請洗掉它們。idd1
d1={'A':{'id':'a'},'B':{'id':'b'}}
d2={'a':1,'b':2, 'c':3}
預期輸出:
{'A': 1, 'B': 2}
uj5u.com熱心網友回復:
您可以遍歷d1并d2用作查找來修改值:
for k, d in d1.items():
d1[k] = d2.get(d['id'])
如果你想修改df2,你可以使用字典理解:
d2 = {k: d2.get(d['id']) for k, d in d1.items()}
或使用兩個回圈(一次修改存在的鍵的值,df1一次洗掉不存在的任何鍵df1):
for k, d in d1.items():
d2[k] = d2.pop(d['id'])
for k in list(d2.keys() - d1.keys()):
d2.pop(k)
輸出:
{'A': 123, 'B': 123}
uj5u.com熱心網友回復:
這可能就是你所追求的
d1={'A':{'id':'a'},'B':{'id':'b'}}
d2={'a':123,'b':123}
for key, id_map in d1.copy().items(): # view over soft copy won't mutate
try:
d1[key] = d2[id_map["id"]]
except KeyError:
pass
>>> d1
{'A': 123, 'B': 123}
但是,未映射的值將保持不變(即,如果有C,但id在其映射中沒有,或者c在d2.. 中沒有)
>>> d1={'A':{'id':'a'},'B':{'id':'b'},'C':{'id':'c'}}
[..]
>>> d1
{'A': 123, 'B': 123, 'C': {'id': 'c'}}
如果你想丟棄未映射的值,你可以在這里使用del d1[key]except 或簡單地創建一個新的字典來將鍵和值打包到(如果 KeyError 被引發,則永遠不會添加)
或者,如果這是一個錯誤(即C 必須存在),你可以簡單地讓KeyError跟注者加注并讓它處理后果
uj5u.com熱心網友回復:
只要每個 'val' 在d1' 的子詞典中最多出現一次(即 ' 中的鍵:{'id': val} 對d1),你就可以像這樣迭代d1' 的專案:
d1 = {'A': {'id': 'a'}, 'B': {'id': 'b'}, 'C': {'id': 'c'}}
d2 = {'a': 123, 'b': 12, 'd': 8}
d3 = {k: d2[v['id']] for k, v in d1.items() if v['id'] in d2}
print(d3)
>>> {'A': 123, 'B': 12}
由于您需要檢查 中的所有鍵值對d1,因此就時間和空間效率而言,這是您可以做的最好的事情。
但是,如果您將使用相同的“重新鍵入”許多d2字典d1,則構建反向索引以重用可能會更快:
reverse_mapping = {v['id']: k for k, v in d1.items()}
def rekey(dict_to_rekey, reverse_map):
return {reverse_map[k]: dict_to_rekey[k]
for k in dict_to_rekey.keys() & reverse_map.keys()}
d3 = rekey(d2, reverse_mapping)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/436688.html
