Iterieren über Wörterbuchschlüsselwerte, die der Liste in Python entsprechen

132

Arbeiten in Python 2.7. Ich habe ein Wörterbuch mit Teamnamen als Schlüssel und der Anzahl der erzielten und zulässigen Läufe für jedes Team als Werteliste:

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

Ich möchte in der Lage sein, das Wörterbuch in eine Funktion einzuspeisen und über jedes Team (die Schlüssel) zu iterieren.

Hier ist der Code, den ich verwende. Im Moment kann ich nur Team für Team gehen. Wie würde ich über jedes Team iterieren und den erwarteten win_percentage für jedes Team drucken?

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

Vielen Dank für jede Hilfe.

Burton Guster
quelle

Antworten:

221

Sie haben mehrere Möglichkeiten, ein Wörterbuch zu durchlaufen.

Wenn Sie über das Wörterbuch selbst iterieren ( for team in league), werden Sie über die Schlüssel des Wörterbuchs iterieren. Beim Schleifen mit einer for-Schleife ist das Verhalten das gleiche, unabhängig davon, ob Sie das dict ( league) selbst durchlaufen oder league.keys():

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

Sie können auch sowohl die Schlüssel als auch die Werte gleichzeitig durchlaufen, indem Sie Folgendes durchlaufen league.items():

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

Sie können sogar Ihr Tupel auspacken, während Sie iterieren:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
Andrew Clark
quelle
43
dict.iteritems () wurde seit Python3 entfernt. Sie sollten stattdessen dict.items () verwenden
Sergey
14
dict.iterkeys () wurde auch in Python 3 entfernt. Sie sollten stattdessen dict.keys () verwenden
Nerrve
1
dict.itervalues ​​() wurde auch in Python 3 entfernt. Sie sollten stattdessen dict.values ​​() verwenden
Zachary Ryan Smith
11

Sie können auch sehr einfach Wörterbücher durchlaufen:

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 macht Dancek traurig
quelle
@BurtonGuster: Wann immer Sie eine Antwort für würdig halten, stimmen Sie bitte ab (klicken Sie auf die Schaltfläche "Auf" auf der linken Seite des Beitrags)! Auf diese Weise helfen Sie auch der Community!
StackExchange saddens dancek 14.
6

Wörterbücher haben eine eingebaute Funktion namens iterkeys().

Versuchen:

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 - Monicas Armee
quelle
5

Mit Wörterbuchobjekten können Sie über ihre Elemente iterieren. Mit Pattern Matching und der Trennung von __future__können Sie die Dinge ein wenig vereinfachen.

Schließlich können Sie Ihre Logik von Ihrem Druck trennen, um das spätere Refactor / Debuggen zu vereinfachen.

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
schweizerisch
quelle
4

Listenverständnis kann Dinge verkürzen ...

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