2013-07-10 139 views
0

對不起,一個簡單的問題,我想我得到的基本循環錯了。我不知道爲什麼我沒有達到預期的結果。在Python詞典中迭代

Comp = {'Red':100, 'Blue':101, 'Green':102 ,'Ivory':103, 'White':104} 
Comp ['Black'] = 99 

def value_for_value(d, mynumber): 
    for key, value in d.iteritems(): 
     print key,value,type(value),mynumber,type(mynumber) 
     mykey = 'AAA' 
     if value == mynumber: 
      mykey = key 
    return mykey 

print value_for_value(Comp,99) 

預期結果:黑色

實際結果:AAA

PS:只是爲了確保我比較正確的數據類型,我打印的數據類型以及。

+2

作爲一個側面說明,這是一個壞主意來命名一個變量'str',因爲這是字符串的類型和構造函數的名稱。而使用「str」作爲整數值更令人困惑。 – abarnert

回答

4

問題是,每次通過循環,你設置mykey = 'AAA'。所以,除非str碰巧是最後一個值,否則你會用錯誤的覆蓋正確答案。

讓我們添加更多的打印出的更好:

def value_for_value(d, str): 
    for key, value in d.iteritems(): 
     mykey = 'AAA' 
     if value == str: 
      mykey = key 
     print key,value,type(value),str,type(str),mykey 
    return mykey 

>>> value_for_value(Comp, 99) 
Blue 101 <type 'int'> 99 <type 'int'> AAA 
Ivory 103 <type 'int'> 99 <type 'int'> AAA 
Black 99 <type 'int'> 99 <type 'int'> Black 
Green 102 <type 'int'> 99 <type 'int'> AAA 
White 104 <type 'int'> 99 <type 'int'> AAA 
Red 100 <type 'int'> 99 <type 'int'> AAA 
'AAA' 

那麼,你如何解決這個問題?很簡單:只要將回退值外循環,所以你只能做一次:

def value_for_value(d, str): 
    mykey = 'AAA' 
    for key, value in d.iteritems(): 
     if value == str: 
      mykey = key 
     print key,value,type(value),str,type(str),mykey 
    return mykey 

現在:

>>> value_for_value(Comp, 99) 
Blue 101 <type 'int'> 99 <type 'int'> AAA 
Ivory 103 <type 'int'> 99 <type 'int'> AAA 
Black 99 <type 'int'> 99 <type 'int'> Black 
Green 102 <type 'int'> 99 <type 'int'> Black 
White 104 <type 'int'> 99 <type 'int'> Black 
Red 100 <type 'int'> 99 <type 'int'> Black 
'Black' 

值得一提的是,這整個事情會更簡單,如果你建逆字典,只是其編入索引:

>>> CompInverse = {value: key for key, value in Comp.iteritems()} 
>>> CompInverse.get(99, 'AAA') 
'Black' 
+0

感謝隊友。我嘗試了'break'方法。儘管你的答案也很好。反字典選項非常有幫助。將接受你的回答:) – misguided

+0

或者使用相同的數據結構:'next((k for k,v in comp.iteritems()if v == 99),'AAA')' –

1

我認爲這是更清晰的把它寫這樣的:

def value_for_value(d, str): 
    for k, v in d.iteritems(): 
     if v == str: 
      return k 
    return 'AAA' 

是不是key_for_value是更有意義的名字?

創建倒字典由@abarnert的建議是一個好主意,如果你會做一堆的查找,而無需修改d