Iterating Over Dictionary Key Values ​​Sesuai dengan Daftar di Python

132

Bekerja di Python 2.7. Saya memiliki kamus dengan nama tim sebagai kunci dan jumlah run yang dicetak dan diizinkan untuk setiap tim sebagai daftar nilai:

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

Saya ingin dapat memberi makan kamus ke fungsi dan beralih ke setiap tim (tombol).

Inilah kode yang saya gunakan. Saat ini, saya hanya bisa pergi tim demi tim. Bagaimana saya mengulangi setiap tim dan mencetak win_percentage yang diharapkan untuk masing-masing tim?

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

Terima kasih atas bantuannya.

Burton Guster
sumber

Jawaban:

221

Anda memiliki beberapa opsi untuk mengulangi kamus.

Jika Anda mengulangi kamus itu sendiri ( for team in league), Anda akan mengulangi kunci kamus. Saat mengulang dengan for for, perilaku akan sama apakah Anda mengulangi dict ( league) itu sendiri, atau league.keys():

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

Anda juga dapat mengulangi kedua kunci dan nilai sekaligus dengan mengulangi league.items():

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

Anda bahkan dapat melakukan tuple membongkar saat iterasi:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
Andrew Clark
sumber
43
dict.iteritems () dihapus sejak Python3. Anda sebaiknya menggunakan dict.items ()
Sergey
14
dict.iterkeys () juga dihapus dengan Python 3. Anda harus menggunakan dict.keys () sebagai gantinya
Nerrve
1
dict.itervalues ​​() juga dihapus dengan Python 3. Anda harus menggunakan dict.values ​​() sebagai gantinya
Zachary Ryan Smith
11

Anda dapat dengan mudah beralih ke kamus, juga:

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
sumber
@ BurtonGuster: Setiap kali Anda berpikir jawaban itu layak, silakan upvote (klik tombol "atas" di sisi kiri pos)! Dengan begitu Anda membantu komunitas juga!
StackExchange saddens dancek
6

Kamus memiliki fungsi bawaan yang disebut iterkeys().

Mencoba:

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 - Tentara Monica
sumber
5

Objek kamus memungkinkan Anda untuk beralih item. Juga, dengan pencocokan pola dan pembagian dari __future__Anda dapat melakukan hal-hal yang menyederhanakan sedikit.

Akhirnya, Anda dapat memisahkan logika Anda dari pencetakan Anda untuk membuat hal-hal yang sedikit lebih mudah untuk di-refactor / debug nanti.

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
Orang Swiss
sumber
4

Pemahaman daftar dapat mempersingkat ...

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