2013-07-10 6 views
0

Désolé une question simple, je suppose que je fais mal la boucle de base. Je ne suis pas sûr pourquoi je n'obtiens pas le résultat attendu.itération dans un dictionnaire 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) 

Résultat attendu: noir

Résultats réels: AAA

PS: juste pour vous assurer que je compare les types de données correctes, j'ai imprimé les types de données et .

+2

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

Répondre

4

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' 
+0

Merci compagnon. J'ai essayé la méthode 'break'. Bien que vos réponses fonctionnent parfaitement bien aussi. L'option dictionnaire inverse est très utile. Acceptera votre réponse :) – misguided

+0

ou avec la même structure de données: 'next ((k pour k, v dans comp.iteritems() si v == 99), 'AAA')' –

1

je pense qu'il est plus clair de l'écrire comme ceci:

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

Un nom plus significatif ne serait-il pas key_for_value?

Création du dict inversé comme suggéré par @abarnert est une bonne idée si vous allez faire un tas de recherches sans modifier d