2011-07-28 3 views
3

Ceci est mon premier post de programmation, ainsi que bien mon premier programme donc s'il vous plaît garder avec moi.Python: Utilisation de plus de modifier les valeurs du dictionnaire

J'ai un dicionary qui est initialisé comme ceci:

tab = ({'Mike': 0, 'Chad': 15, 'Taylor': 2}) 

Je veux être en mesure d'ajouter des entiers à chaque valeur dans le dictionnaire.
Par exemple, après avoir ajouté 5, le dictionnaire devrait ressembler à ceci:

tab = ({'Mike':5, 'Chad': 20, 'Taylor': 7}) 

Il semble que cela peut être fait avec quelques lignes de code, mais je ne peux pas comprendre. J'ai essayé une boucle:

for k in tab.itervalues(): 
    k = k + 5 

Je lance ce code, puis imprimer le dictionnaire:

tab = ({'Mike': 0, 'Chad': 15, 'Taylor': 2}) 

Le dictionnaire n'a subi aucun changement. Je ne suis pas sûr si Python reconnaît les valeurs comme des chaînes ou des entiers. Je suis sûr que certains d'entre vous sourient à ma question et à sa simplicité. Merci de votre attention.

+1

Vous n'avez pas besoin de parenthèses autour de {}. – utdemir

+0

La ligne 'k = k + 5' crée en fait une toute nouvelle variable. Vous ne pouvez pas le voir parce que python vous le cache (cela fait partie du paradigme pass-by-object de python). Cependant, ce n'est ni ici ni là.Même si vous * pouvez * modifier k, cela ne modifiera pas le dictionnaire. Voir la réponse par paradoxe de la gaufre pour la bonne approche. –

Répondre

12

La meilleure façon?

for k in tab.keys(): 
    tab[k] += 5 
+2

Juste 'pour k dans tab'? – utdemir

+0

Honnêtement, je trouve tab.keys() plus lisible, mais oui ça marcherait aussi. –

+0

Merci. J'ai beaucoup à apprendre, je vais commencer par les boucles. – MZ420

6

tab.itervalues() crée un itérateur sur les valeurs.

Vous itérer sur ces derniers, et sont remis chaque valeur à son tour. Les valeurs sont int s. En Python, ceux-ci sont immuables.

En Python, l'instruction a += 3 est traduite - en le plus cas - à a = a + 3. a + 3 crée un nouveau objet int, pour le cas où a déjà fait référence à un entier, puis le nom a est rebondir au nouvel objet.

Alors vous modifiez la variable d'itération (par reconsolidation), mais pas la valeur de la carte (parce qu'il est immuable). La solution de

paradoxe gaufre contourne cela en utilisant un itérateur sur les touches pour accéder puis lier à nouveau les valeurs à l'intérieur du dict. C'est simple et Pythonic et bien.

Alternativement, vous pouvez embraser l'immutabilité, et appliquer le paradigme de programmation fonctionnelle. Nous voulons créer un dictionnaire semblable à celui que nous avons mais avec les touches incrémentées; et le fait que tab fasse référence à ce nouveau dictionnaire n'est qu'accidentel.

Ainsi:

tab = dict((k, v + 5) for (k, v) in tab.iteritems()) 

Cette approche souvent vous rendre la vie plus facile quand vous avez un problème plus difficile basé sur la même question fondamentale.

+1

Mon inclination naturelle aurait été de muter le dict original. J'aime l'approche alternative et je vais essayer de garder cela à l'esprit pour l'avenir. – steveha

+1

De nos jours, nous pouvons écrire beaucoup plus joli 'tab = {k: v + 5 pour k, v dans tab.items()}'. –

Questions connexes