2

所以我有两个字典:

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、成本、评级的数组。

我一直想不出办法来做到这一点。有什么建议么?

谢谢!

4

3 回答 3

3
dic3 = {k : (v1, dic2[k]) for k, v1 in dic1.items() if k in dic2}
于 2013-06-19T19:26:48.607 回答
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)}
于 2013-06-19T19:25:57.767 回答
1

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

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

或者这种方法适用于最新版本的 Python(>= 2.7 但< 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)}
于 2013-06-19T19:27:32.353 回答