2011-09-13 19 views
88

Lavorare in Python 2.7. Ho un dizionario con i nomi di squadra come le chiavi e la quantità di piste segnato e ha permesso per ogni squadra, come la lista valori:Iterazione sui valori delle chiavi del dizionario corrispondente alla lista in Python

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

Vorrei essere in grado di alimentare il dizionario in una funzione e iterare ogni squadra (le chiavi).

Ecco il codice che sto utilizzando. In questo momento, posso andare solo squadra per squadra. Come potrei scorrere su ogni squadra e stampare il win_percentage previsto per ogni squadra?

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 

Grazie per qualsiasi aiuto.

+1

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

risposta

141

Sono disponibili diverse opzioni per iterare su un dizionario.

Se si esegue un'iterazione sul dizionario stesso (for team in league), verrà eseguito un iter sui tasti del dizionario. Quando si esegue il ciclo con un ciclo for, il comportamento sarà lo stesso sia che si esegua il looping del ditt() stesso, league.keys() o league.iterkeys(). dict.iterkeys() è generalmente preferibile perché è esplicito ed efficiente:

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

È possibile anche scorrere su entrambi i tasti ed i valori in una volta sola iterazione su league.items() o league.iteritems():

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

È anche possibile eseguire la tuple disimballaggio mentre iterating:

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

dict.iteritems() è stato rimosso da Python3. Dovresti usare dict.items() invece – Sergey

+11

dict.iterkeys() è stato rimosso anche in Python 3. Dovresti invece usare dict.keys() – Nerrve

8

Si può facilmente iterare su dizionari, troppo:

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

Grazie per l'aiuto! Il codice funzionava alla grande. –

+0

@BurtonGuster: Ogni volta che pensi che una risposta sia degna, per favore vai su (fai clic sul pulsante "su" sul lato sinistro del post)! In questo modo stai anche aiutando la comunità! – dancek

5

dizionari hanno un costruito in funzione chiamata iterkeys().

Prova:

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

Grazie per l'aiuto! –

4

Gli oggetti del dizionario consentono di scorrere i relativi articoli. Inoltre, con il pattern matching e la divisione da __future__ puoi semplificare un po 'le cose.

Infine, è possibile separare la logica dalla stampa per semplificare il refactoring/debug in un secondo momento.

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

di lista può abbreviare le cose ...

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