使用相同的键合并Python中的两个词典

时间:2017-12-18 13:24:37

标签: python dictionary merge

我有两个字典,只有相同的密钥。 第一本字典是:

 { "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 个答案:

答案 0 :(得分:9)

这就像一行 dict comprehension 一样简单。

>>> {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'}

当你不能保证两个字典都具有完全相同的密钥时,这在一般意义上是很好的。

在python2.7及更早版本上,您需要稍作修改,因为keys()会返回一个列表。使用set.intersection -

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

如果你正在使用列表的dicts,那么上面的代码需要在相应的列表之间进行zip ping -

>>> 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"
    }
}

答案 1 :(得分: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 。您还可以对密钥进行初步检查,例如检查其交叉点,以确保两个字典都具有相同的密钥。

答案 2 :(得分:1)

你可以试试这个:

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

输出:

{{1}}