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.

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)

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)

@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

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

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]]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.