匹配来自两个词典的键,并使用匹配的键和两个关联值创建新词典

时间:2013-06-19 19:23:25

标签: python python-2.7 dictionary

所以我有两本词典:

dic1 = {1.0: 9.0, 3.0: 33.0, 5.0: 13.0}
dic2 = {1.0: 3.4, 3.0: 88.9, 4.0: 73.0, 5.0: 9.0}

每个中的键都是ID号,dic1中的值是等级,dic2中的值是成本。

我想要的是一种将每个ID号与其成本和评级相关联的方法,并在此过程中删除在dic1中没有匹配的任何键dic2。

dic3 = {1.0: (9.0, 4.2), 3.0: (33.0, 88.9), 5.0: (13.0, 9.0)}

然后,我希望能够创建一个包含列ID,成本,评级的数组。

我无法想办法做到这一点。有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

dic3 = {k : (v1, dic2[k]) for k, v1 in dic1.items() if k in dic2}

答案 1 :(得分:1)

使用dict-comprehension,dic1.viewkeys() & dic2.viewkeys()返回两个词典中所有常用键的集合:

>>> dic1 = {1.0: 9.0, 3.0: 33.0, 5.0: 13.0}
>>> dic2 = {1.0: 3.4, 3.0: 88.9, 4.0: 73.0, 5.0: 9.0}
>>> {k : (dic1[k],dic2[k])  for k in dic1.viewkeys() & dic2.viewkeys()}
{1.0: (9.0, 3.4), 3.0: (33.0, 88.9), 5.0: (13.0, 9.0)}

对于py2.6及更早版本,请使用dict()

>>> dict( (k , (dic1[k],dic2[k]))  for k in dic1.viewkeys() & dic2.viewkeys())
{1.0: (9.0, 3.4), 3.0: (33.0, 88.9), 5.0: (13.0, 9.0)}

在py3.x上只使用dict.keys()

>>> {k : (dic1[k],dic2[k])  for k in dic1.keys() & dic2.keys()}
{1.0: (9.0, 3.4), 3.0: (33.0, 88.9), 5.0: (13.0, 9.0)}

答案 2 :(得分:1)

试试这个,它适用于旧版本的Python(早于2.7):

dic3 = {}
for k in dic1.viewkeys() & dic2.viewkeys():
    dic3[k] = (dic1[k], dic2[k])

或者这是一种方法,可以使用词典理解在最新版本的Python上工作(&gt; = 2.7但<&lt; 3.0):

dic3 = { k : (dic1[k], dic2[k]) for k in dic1.viewkeys() & dic2.viewkeys() }

在Python 3.0及更高版本中,键已被视为集合,产生最好的解决方案:

dic3 = { k : (dic1[k], dic2[k]) for k in dic1.keys() & dic2.keys() }

无论如何,确定两个词典共有的键的技巧是与它们的集合相交,并且它按预期工作:

dic3
=> {1.0: (9.0, 3.4), 3.0: (33.0, 88.9), 5.0: (13.0, 9.0)}