我有两个嵌套的字典:
d:
{'redFish': {'redFish': 'inf', 'blueFish': 9, 'twoFish': 10, 'oneFish': 6},
'blueFish': {'redFish': 9, 'blueFish': 'inf', 'twoFish': 11, 'oneFish': 10},
'twoFish': {'redFish': 10, 'blueFish': 11, 'twoFish': 'inf', 'oneFish': 8},
'oneFish': {'redFish': 6, 'blueFish': 10, 'twoFish': 8, 'oneFish': 'inf'}}
和
newDict:
{'blueFish': {'blueFish': None, 'twoFish': None, ('redFish', 'oneFish'): None},
'twoFish': {'blueFish': None, 'twoFish': None, ('redFish', 'oneFish'): None},
('redFish', 'oneFish'): {'blueFish': None, 'twoFish': None, ('redFish', 'oneFish'): None}}
我想将值从d
传输到newDict
,以获取相同的密钥对。对于这些词典,这些密钥对是
[blueFish][blueFish]
[blueFish][twoFish]
[twoFish][blueFish]
[twoFish][twoFish]
如果这可行,则d
中这些密钥对的值将被移至newDict
中相同的密钥对。
我编写了这段代码来尝试执行此操作:
for name1 in newDict:
for name2 in name1:
for nameA in d:
for nameB in d:
if name1 == nameA and name2 == nameB:
newDict[name1][name2] = d[nameA][nameB]
但是,newDict
中没有任何更改,因为所有密钥对的所有值都为None
。我该如何解决这个问题,为什么我的代码无法正常工作?
答案 0 :(得分:2)
您可以利用字典keys
像集合一样工作的事实。您可以使用以下内容找到这两个词典共有的键:
d.keys() & newDict.keys()
哪个会给你一个可以迭代的集合:
{'blueFish', 'twoFish'}
您可以在内部字典中执行相同的操作,以仅更新常见的值:
for k in d.keys() & newDict.keys():
newDict[k].update((k2, d[k][k2]) for k2 in newDict[k].keys() & d[k].keys())
我认为在python 2中,您可以直接从字典中进行设置,因此这应该以相同的方式进行:
for k in set(d) & set(newDict):
newDict[k].update((k2, d[k][k2]) for k2 in set(newDict[k]) & set(d[k]))
答案 1 :(得分:1)
您可以使用按键的交集:
set(d.keys()) & set(newDict.keys())
# {'blueFish', 'twoFish'}
for k, v in d.iteritems():
for i in set(newDict.get(k, {}).keys()) & set(v.keys()):
newDict[k][i] = v[i]
print(newDict)
# {'blueFish': {'blueFish': 'inf', 'twoFish': 11, ('redFish', 'oneFish'): None},
# 'twoFish': {'blueFish': 11, 'twoFish': 'inf', ('redFish', 'oneFish'): None},
# ('redFish', 'oneFish'): {'blueFish': None, 'twoFish': None, ('redFish', 'oneFish'): None}}