2011-09-13 15 views
88

Praca w języku Python 2.7. Mam słownik z nazwy zespołu jak przyciski i ilości zdobytych i dozwolonym dla każdej drużyny, jak listy wartość:Iterowanie nad wartościami kluczowymi słownika korespondującymi z listą w pythniku ​​

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

Chciałbym móc karmić słownika do funkcji i iteracyjne nad każdym zespół (klucze).

Oto kod, którego używam. Teraz mogę iść tylko drużyną po drużynie. Jak powinienem powtórzyć każdą drużynę i wydrukować oczekiwany współczynnik_wysokości dla każdej drużyny?

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 

Dzięki za pomoc.

+1

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

Odpowiedz

141

Masz kilka opcji iteracji nad słownikiem.

Po przejrzeniu samego słownika (for team in league) nastąpi iteracja po kluczach słownika. Podczas zapętlania pętli for zachowanie będzie takie samo, niezależnie od tego, czy pętli nad samym dict(), league.keys() lub league.iterkeys(). dict.iterkeys() jest generalnie lepszym rozwiązaniem, ponieważ jest wyraźny i skuteczny:

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

Możesz też iterować zarówno kluczy i wartości naraz iteracji nad league.items() lub league.iteritems():

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

Można nawet wykonywać swoje krotka rozpakowaniu podczas iteracji:

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

dict.iteritems() został usunięty od czasu Python3. Powinieneś użyć polecenia dict.items() zamiast: – Sergey

+11

dict.iterkeys() również został usunięty w Pythonie 3. Zamiast tego powinieneś użyć funkcji dict.keys() – Nerrve

8

Można bardzo łatwo iterować słowniki też:

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

Dzięki za pomoc! Kod działał świetnie. –

+0

@BurtonGuster: Za każdym razem, gdy uważasz, że odpowiedź jest godna, wykonaj upvote (kliknij przycisk "w górę" po lewej stronie posta)! W ten sposób pomagasz także społeczności! – dancek

5

Słowniki posiada wbudowaną funkcję o nazwie iterkeys().

Spróbuj:

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

Dzięki za pomoc! –

4

Słownik obiekty pozwalają na iteracyjne nad swoje pozycje. Ponadto, przy dopasowywaniu wzorców i podziale z __future__ można nieco uprościć.

Wreszcie można oddzielić logikę od drukowania, aby nieco łatwiej było później refaktoryzować/debugować.

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 rozumienie może skrócić rzeczy ...

win_percentages = [m**2.0/(m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]] 
Powiązane problemy