Iterar sobre valores clave del diccionario correspondientes a la lista en Python

132

Trabajando en Python 2.7. Tengo un diccionario con los nombres de los equipos como claves y la cantidad de carreras anotadas y permitidas para cada equipo como la lista de valores:

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

Me gustaría poder introducir el diccionario en una función e iterar sobre cada equipo (las teclas).

Aquí está el código que estoy usando. En este momento, solo puedo ir equipo por equipo. ¿Cómo iteraría sobre cada equipo e imprimiría el win_percentage esperado para cada equipo?

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

Gracias por cualquier ayuda.

Burton Guster
fuente

Respuestas:

221

Tiene varias opciones para iterar sobre un diccionario.

Si itera sobre el diccionario en sí ( for team in league), iterará sobre las teclas del diccionario. Cuando un bucle con un bucle for, el comportamiento será el mismo si se recorre el dict ( league) en sí, o league.keys():

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

También puede iterar sobre las claves y los valores a la vez iterando sobre league.items():

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

Incluso puede realizar su desempaquetado de tuplas mientras itera:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
Andrew Clark
fuente
43
dict.iteritems () se eliminó desde Python3. Deberías usar dict.items () en su lugar
Sergey
14
dict.iterkeys () también se eliminó en Python 3. Debería usar dict.keys () en su lugar
Nerrve
1
dict.itervalues ​​() también se eliminó en Python 3. Debería usar dict.values ​​() en su lugar
Zachary Ryan Smith
11

También puede iterar fácilmente sobre los diccionarios:

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 entristece a dancek
fuente
@BurtonGuster: ¡Siempre que piense que una respuesta es digna, vote por favor (haga clic en el botón "arriba" en el lado izquierdo de la publicación)! ¡De esa manera también estás ayudando a la comunidad!
StackExchange entristece a dancek el
6

Los diccionarios tienen una función incorporada llamada iterkeys().

Tratar:

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 - El ejército de Mónica
fuente
5

Los objetos de diccionario le permiten iterar sobre sus elementos. Además, con la coincidencia de patrones y la división de __future__usted puede simplificar un poco las cosas.

Finalmente, puede separar su lógica de su impresión para facilitar un poco la refactorización / depuración posterior.

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
suizo
fuente
4

La comprensión de la lista puede acortar las cosas ...

win_percentages = [m**2.0 / (m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]]
Benjamín
fuente