在Python中合并两个拥有相同键的字典

3
我有两个字典,它们的键完全相同。第一个字典是:
 { "key_1" : "AR" ,
   "key_2":"BR" ,
   "key_3" : "CR" }

第二个是:
{ "key_1" : "signinfication of AR" ,
  "key_2":" signinfication of  BR" ,
  "key_3" : " signinfication of  CR" }

我希望能获得以下字典:

{"key_1" : {"AR" : "signinfication of AR"} ,
 "key_2" : {"BR" : "signinfication of BR"} ,
 "key_3" : {"CR" : "signinfication of CR"}

感谢您的帮助!
3个回答

9
这只需要一行字典推导式就能实现。
>>> {k : {d1[k]  : d2[k]} for k in d1.keys() & d2.keys()}
{
    "key_2": {
        "BR": " signinfication of  BR"
    },
    "key_1": {
        "AR": "signinfication of AR"
    },
    "key_3": {
        "CR": " signinfication of  CR"
    }
}

在这里,d1d2是你的两个字典。 d1.keys() & d2.keys()将对字典键执行交集操作,以确保迭代是在存在于两个字典中的键上进行的。在这里,就是

d1.keys() & d2.keys()
{'key_1', 'key_2', 'key_3'}

在一般情况下,这是很有用的,尤其当你无法保证两个字典具有完全相同的键时。


在 Python 2.7 及更早版本中,需要进行轻微修改,因为 keys() 返回一个列表。可以使用 set.intersection -

>>> {k : {d1[k]  : d2[k]} for k in set(d1.keys()).intersection(d2.keys())}

如果您正在使用字典的列表,那么上面的代码需要在相应的列表之间进行 "zip" 操作 -
>>> d1
{
    "key_1": [
        "AR",
        "BR",
        "CR"
    ],
    ...
}    
>>> d2
{
    "key_1": [
        "signfication of AR",
        "signfication of BR",
        "signfication of  CR"
    ],
    ...
}

>>> {k : dict(zip(d1[k], d2[k])) for k in d1.keys() & d2.keys()}
{
    "key_1": {
        "BR": "signfication of BR",
        "CR": "signfication of  CR",
        "AR": "signfication of AR"
    },
    "key_3": {
        "CE": " signfication of CE",
        "AE": "signfication of AE",
        "BE": " signfication of BE"
    },
    "key_2": {
        "BZ": "signfication of BZ",
        "CZ": "signfication of CZ",
        "AZ": "signfication of AZ"
    }
}

2
你也可以使用 zip() 将字典的 items() 组合在一起,然后将它们合并在一起:
d1 = {"key_1" : "AR",
      "key_2":"BR",
      "key_3" : "CR"}

d2 = {"key_1" : "signinfication of AR",
      "key_2":" signinfication of  BR",
      "key_3" : " signinfication of  CR"}

# make sure both lists have same ordered keys
l1 = sorted(d1.items())
l2 = sorted(d2.items())

d = {k1 : {v1:v2} for (k1, v1), (_, v2) in zip(l1, l2)}

print(d)

这将输出:

{'key_1': {'AR': 'signinfication of AR'}, 
 'key_2': {'BR': ' signinfication of  BR'}, 
 'key_3': {'CR': ' signinfication of  CR'}}

编辑:

正如 @cᴏʟᴅsᴘᴇᴇᴅ 建议的那样,在将两个列表压缩之前,您可以对它们调用 sorted,这可以确保两个字典具有相同的顺序:key_1key_2key_3。您还可以对键进行初步检查,例如检查它们的交集,以确保两个字典具有相同的键。


1
你能保证这两个字典返回的键以相同的顺序吗? - cs95
@cᴏʟᴅsᴘᴇᴇᴅ 嗯,我没有想到那个,抱歉。我猜OP可以使用你在答案中的建议来确保这一点。无论如何,我会添加这个的,谢谢。 - RoadRunner
2
保证这个并不是什么大问题,只需要调用 sorted 函数就可以了,应该能够正常工作。已点赞,干杯。 - cs95

1
你可以尝试这个:

s = { "key_1" : "AR" ,
 "key_2":"BR" ,
 "key_3" : "CR" }

d = { "key_1" : "signinfication of AR" ,
 "key_2":" signinfication of  BR" ,
 "key_3" : " signinfication of  CR" }
new_d = {a:{b:d[a]} for a, b in s.items()}

输出:

{'key_1': {'AR': 'signinfication of AR'}, 'key_3': {'CR': ' signinfication of  CR'}, 'key_2': {'BR': ' signinfication of  BR'}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接