如何在两个词典中映射相同的项目并生成其相应键的值列表

时间:2013-08-24 09:38:51

标签: python dictionary mapping

我的目标是将小字典映射到大字典并返回大字典中的值列表,该字典带有小字典的相应键。

x={'red':0.25, 'yellow':0.05, 'pink':0.35, 'brown':0.22, 'blue':0.13}
y={'red':2, 'blue':3, 'yellow':1}

我的代码不断给我一个大字典的完整值列表。

for b in x.keys():
    if b in y.keys():
        k=y.values()
print k

output: [0.35, 0.22, 0.13, 0.05, 0.25]

Desired output:
[0.25,0.13,0.05]

有什么建议吗? 感谢。

4 个答案:

答案 0 :(得分:2)

这样的东西?我认为订单无关紧要,因为这些是字典。另外,假设您似乎在迭代x.keys(),那么y中可能存在x中不存在的某些值,并且您不希望它们被映射。< / p>

>>> x={'red':0.25, 'yellow':0.05, 'pink':0.35, 'brown':0.22, 'blue':0.13}
>>> y={'red':2, 'blue':3, 'yellow':1}
>>> [val for elem, val in x.items() if elem in y]
[0.13, 0.05, 0.25]

如果y中没有值不在x中,那么您可以简单地遍历y词典。

>>> [x[key] for key in y]
[0.13, 0.05, 0.25]

PS - 您的代码中的问题是,每次找到匹配项时,都会将y.values()的整个列表分配给k,最终会得到一个完整的列表价值观你可以修改你的代码看起来像这样

>>> k = []
>>> for b in x.keys():
    if b in y.keys():
        k.append(x[b])


>>> k
[0.13, 0.05, 0.25]

虽然迭代字典会产生类似的结果,如下所示

>>> for b in x:
    if b in y:
        k.append(x[b])


>>> k
[0.13, 0.05, 0.25]

答案 1 :(得分:1)

k = [x[key] for key in y.keys()]

答案 2 :(得分:1)

您的代码存在的问题是,您要将y.values()分配给k。因此,k只是dict y的值列表。您可以像这样修改代码以使其正常工作:

k = []
for b in x.keys():
    if b in y.keys():
        k.append(x[b])
print k

您还可以使用列表理解:

>>> x={'red':0.25, 'yellow':0.05, 'pink':0.35, 'brown':0.22, 'blue':0.13}
>>> y={'red':2, 'blue':3, 'yellow':1}

>>> [x[key] for key in y]
[0.13, 0.05, 0.25]

答案 3 :(得分:0)

我会将此视为两个集合的交集,然后传递子集以映射所有相应的值。通过这种方式,它比列表理解更容易理解。

>>> map(x.get, set(x) & set(y))
>>> [0.13, 0.05, 0.25]

当然,你可以对列表理解做同样的事情:

>>> [x.get(i) for i in set(x) & set(y)]
>>> [0.13, 0.05, 0.25]