当键对相同时,将值从一个嵌套字典复制到另一个嵌套字典

时间:2019-12-06 23:40:04

标签: python python-2.7 dictionary

我有两个嵌套的字典:

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。我该如何解决这个问题,为什么我的代码无法正常工作?

2 个答案:

答案 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}}