2011-09-13 16 views
88

Trabajar en Python 2.7. Tengo un diccionario con los nombres del equipo como las llaves y la cantidad de carreras anotadas y permitido para cada equipo en la lista de valores:Iteraciones sobre los valores clave del diccionario correspondientes a la lista en Python

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

Me gustaría ser capaz de alimentar el diccionario en una función y iterar sobre cada uno equipo (las llaves).

Aquí está el código que estoy usando. En este momento, solo puedo ir equipo por equipo. ¿Cómo puedo iterar sobre cada equipo e imprimir el porcentaje de victorias 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.

+1

'dic.items()' ... – JBernardo

Respuesta

141

Usted tiene varias opciones para la iteración en un diccionario.

Si itera sobre el diccionario mismo (for team in league), estará iterando sobre las teclas del diccionario. Al realizar un bucle con un bucle for, el comportamiento será el mismo si realiza un bucle sobre el dict() en sí, league.keys() o league.iterkeys(). dict.iterkeys() es preferible, en general, ya que es explícita y eficiente:

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

También puede iterar sobre las claves y los valores de una vez por iteración sobre league.items() o league.iteritems():

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

Es posible incluso realizar su tupla desembalaje, mientras que la iteración:

for team, (runs_scored, runs_allowed) in league.iteritems(): 
    runs_scored = float(runs_scored) 
    runs_allowed = float(runs_allowed) 
+28

dict.iteritems() se eliminó desde Python3. Debería usar dict.items() en su lugar – Sergey

+11

dict.iterkeys() también se eliminó en Python 3. Debería usar dict.keys() en su lugar – Nerrve

8

Se puede recorrer muy fácilmente a través de los diccionarios, también:

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) 
+0

Gracias por la ayuda! El código funcionó muy bien. –

+0

@BurtonGuster: ¡Siempre que piense que una respuesta es digna, por favor vote (haga clic en el botón "arriba" en el lado izquierdo de la publicación)! ¡De esa forma también estás ayudando a la comunidad! – dancek

5

Diccionarios han construido en la función llamada iterkeys().

Probar:

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 
+0

¡Gracias por la ayuda! –

4

objetos diccionario le permiten iterar sobre sus artículos. Además, con la coincidencia de patrones y la división de __future__, puede simplificar un poco las cosas.

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

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 
2

Lista de comprensión puede acortar cosas ...

win_percentages = [m**2.0/(m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]] 
Cuestiones relacionadas