我的目标是将小字典映射到大字典并返回大字典中的值列表,该字典带有小字典的相应键。
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]
有什么建议吗? 感谢。
答案 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]