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.

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)

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)

@ 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

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

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]]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.