問題是,每次通過循環,你設置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'
作爲一個側面說明,這是一個壞主意來命名一個變量'str',因爲這是字符串的類型和構造函數的名稱。而使用「str」作爲整數值更令人困惑。 – abarnert