Le problème est que chaque fois à travers la boucle, vous définissez mykey = 'AAA'
. Donc, à moins que str
ne soit la dernière valeur, vous écraserez la bonne réponse avec la mauvaise.
Ajoutons quelques plus d'impressions pour mieux voir:
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'
Alors, comment voulez-vous résoudre ce problème? Simple: il suffit de déplacer la valeur de repli en dehors de la boucle, de sorte que vous faites seulement une fois:
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
maintenant:
>>> 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'
Il convient de noter que cette chose serait plus simple si vous avez construit un dict inverse et juste indexé il:
>>> CompInverse = {value: key for key, value in Comp.iteritems()}
>>> CompInverse.get(99, 'AAA')
'Black'
Comme une note de côté, il est une mauvaise idée de nommer une variable 'str', depuis c'est le nom du type et du constructeur pour les chaînes. Et c'est encore plus déroutant d'utiliser le nom 'str' pour une valeur entière. – abarnert