Iterowanie wartości kluczowych słownika odpowiadających liście w Pythonie

136

Praca w Pythonie 2.7. Mam słownik z nazwami drużyn jako kluczami i liczbą punktów zdobytych i dozwolonych dla każdej drużyny jako listę wartości:

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

Chciałbym móc wprowadzić słownik do funkcji i iterować po każdym zespole (klawiszach).

Oto kod, którego używam. W tej chwili mogę grać tylko w drużynie. W jaki sposób mógłbym iterować po każdej drużynie i wydrukować oczekiwany procent procentowy 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 wszelką pomoc.

Burton Guster
źródło

Odpowiedzi:

226

Masz kilka opcji iteracji po słowniku.

Jeśli wykonasz iterację po samym słowniku ( for team in league), będziesz iterować po klawiszach słownika. Podczas wykonywania pętli za pomocą pętli for zachowanie będzie takie samo, niezależnie od tego, czy wykonasz pętlę nad leaguesamą dict ( ), czy league.keys():

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

Możesz również iterować po obu kluczach i wartościach na raz, wykonując iterację po league.items():

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

Możesz nawet rozpakować swoją krotkę podczas iteracji:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
Andrew Clark
źródło
44
dict.iteritems () została usunięta od czasu Python3. Zamiast tego powinieneś użyć dict.items ()
Sergey
14
dict.iterkeys () również został usunięty w Pythonie 3. Zamiast tego należy użyć dict.keys ()
Nerrve
1
Funkcja dict.itervalues ​​() została również usunięta w Pythonie 3. Zamiast tego należy użyć dict.values ​​()
Zachary Ryan Smith
11

Możesz również bardzo łatwo iterować po słownikach:

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 saddens dancek
źródło
@BurtonGuster: Ilekroć uznasz odpowiedź za godną, ​​zagłosuj za (kliknij przycisk „w górę” po lewej stronie postu)! W ten sposób pomagasz także społeczności!
StackExchange saddens dancek
6

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

Próbować:

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 - Armia Moniki
źródło
5

Obiekty słownika pozwalają na iterację po ich elementach. Ponadto dzięki dopasowaniu wzorca i podziałowi od __future__ciebie możesz trochę uprościć.

Wreszcie, możesz oddzielić logikę od drukowania, aby nieco ułatwić późniejszą refaktoryzację / debugowanie.

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
szwajcarski
źródło
4

Zrozumienie listy 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]]
Benzoes
źródło