2013-08-24 23 views
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] 

有什麼建議嗎? 謝謝。

回答

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] 

如果有y不在x沒有值,那麼你可以簡單地遍歷y字典。

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

P.S. - 您的代碼中存在的問題是,每次找到匹配項時,都會將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] 
+0

嗨@Sukrit,感謝很多的解決方案和解釋。我現在對這個問題有了更好的理解。 – Tiger1

+0

@ Tiger1:很高興我的回答很有幫助。 :) –

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

的問題與你的代碼,你要分配y.values()k。所以你的k不過是字典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] 
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] 
相關問題