1

我的目标是将小字典映射到大字典,并返回大字典中的值列表,其中包含与小字典对应的键。

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

4 回答 4

2

像这样的东西?我认为顺序无关紧要,因为这些是字典。另外,假设由于您似乎正在迭代x.keys(),那么可能有一些值y不存在x并且您不希望它们被映射。

>>> 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]

如果 iny中没有不在 in 中的值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]
于 2013-08-24T09:40:05.007 回答
1
k = [x[key] for key in y.keys()]
于 2013-08-24T09:40:56.250 回答
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]
于 2013-08-24T09:41:09.080 回答
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]
于 2013-08-24T10:46:54.393 回答