Itération sur les valeurs clés du dictionnaire correspondant à la liste en Python

132

Travailler en Python 2.7. J'ai un dictionnaire avec les noms des équipes comme clés et le nombre de points marqués et autorisés pour chaque équipe comme liste de valeurs:

NL_East = {'Phillies': [645, 469], 'Braves': [599, 548], 'Mets': [653, 672]}

J'aimerais pouvoir alimenter le dictionnaire dans une fonction et parcourir chaque équipe (les touches).

Voici le code que j'utilise. Pour le moment, je ne peux aller équipe par équipe. Comment pourrais-je parcourir chaque équipe et imprimer le win_percentage attendu pour chaque équipe?

def Pythag(league):
    runs_scored = float(league['Phillies'][0])
    runs_allowed = float(league['Phillies'][1])
    win_percentage = round((runs_scored**2)/((runs_scored**2)+(runs_allowed**2))*1000)
    print win_percentage

Merci pour toute aide.

Burton Guster
la source

Réponses:

221

Vous disposez de plusieurs options pour parcourir un dictionnaire.

Si vous effectuez une itération sur le dictionnaire lui-même ( for team in league), vous itérez sur les clés du dictionnaire. Lors d'une boucle avec une boucle for, le comportement sera le même que vous boucliez sur dict ( league) lui-même, ou league.keys():

for team in league.keys():
    runs_scored, runs_allowed = map(float, league[team])

Vous pouvez également parcourir les clés et les valeurs à la fois en itérant sur league.items():

for team, runs in league.items():
    runs_scored, runs_allowed = map(float, runs)

Vous pouvez même effectuer le déballage de votre tuple lors de l'itération:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
Andrew Clark
la source
43
dict.iteritems () a été supprimé depuis Python3. Vous devriez utiliser dict.items () à la place
Sergey
14
dict.iterkeys () a également été supprimé dans Python 3. Vous devriez utiliser dict.keys () à la place
Nerrve
1
dict.itervalues ​​() a également été supprimé dans Python 3. Vous devriez utiliser dict.values ​​() à la place
Zachary Ryan Smith
11

Vous pouvez également parcourir très facilement les dictionnaires:

for team, scores in NL_East.iteritems():
    runs_scored = float(scores[0])
    runs_allowed = float(scores[1])
    win_percentage = round((runs_scored**2)/((runs_scored**2)+(runs_allowed**2))*1000)
    print '%s: %.1f%%' % (team, win_percentage)
StackExchange attriste la danse
la source
@BurtonGuster: Chaque fois que vous pensez qu'une réponse vaut la peine, veuillez voter pour (cliquez sur le bouton «haut» sur le côté gauche du message)! De cette façon, vous aidez aussi la communauté!
StackExchange triste dancek le
6

Les dictionnaires ont une fonction intégrée appelée iterkeys().

Essayer:

for team in league.iterkeys():
    runs_scored = float(league[team][0])
    runs_allowed = float(league[team][1])
    win_percentage = round((runs_scored**2)/((runs_scored**2)+(runs_allowed**2))*1000)
    print win_percentage
Hod - L'armée de Monica
la source
5

Les objets dictionnaire vous permettent de parcourir leurs éléments. En outre, avec la correspondance de motifs et la division de, __future__vous pouvez simplifier un peu les choses.

Enfin, vous pouvez séparer votre logique de votre impression pour rendre les choses un peu plus faciles à refactoriser / déboguer plus tard.

from __future__ import division

def Pythag(league):
    def win_percentages():
        for team, (runs_scored, runs_allowed) in league.iteritems():
            win_percentage = round((runs_scored**2) / ((runs_scored**2)+(runs_allowed**2))*1000)
            yield win_percentage

    for win_percentage in win_percentages():
        print win_percentage
Suisse
la source
4

La compréhension de liste peut raccourcir les choses ...

win_percentages = [m**2.0 / (m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]]
Benjamin
la source