web-dev-qa-db-fra.com

Itération sur les valeurs de clé de dictionnaire correspondant à la liste dans Python

Travailler dans 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]}

Je voudrais pouvoir insérer le dictionnaire dans une fonction et parcourir chaque équipe (les clés).

Voici le code que j'utilise. À l'heure actuelle, je ne peux aller équipe par équipe. Comment pourrais-je parcourir chaque équipe et imprimer le pourcentage de victoire 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.

122
Burton Guster

Vous avez plusieurs options pour parcourir un dictionnaire.

Si vous parcourez le dictionnaire lui-même (for team in league]), vous effectuerez une itération sur les clés du dictionnaire. Lorsque vous bouclez avec une boucle for, le comportement sera le même si vous passez en boucle sur le 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 simultanément les clés et les valeurs en effectuant une itération sur league.items():

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

Vous pouvez même effectuer le décompactage de votre tuple en effectuant une itération:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
201
Andrew Clark

Vous pouvez aussi très facilement parcourir des 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)
10
dancek

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
6
HodofHod

Les objets du dictionnaire vous permettent de parcourir leurs éléments. De plus, avec la recherche 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 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
5
Swiss

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]]
3
Benjamin