Python'da Listeye Karşılık Gelen Sözlük Anahtar Değerleri Üzerinde Yineleme


132

Python 2.7'de çalışmak. Değer listesi olarak takım adları ve her takım için puanlanan ve izin verilen koşu sayısı içeren bir sözlüğüm var:

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

Sözlüğü bir işleve aktarabilmek ve her takım (anahtarlar) üzerinde yinelemek istiyorum.

İşte kullandığım kod. Şu anda sadece takım halinde gidebiliyorum. Her takımı nasıl yinelerim ve her takım için beklenen kazanç_ yüzdesini yazdırırım?

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

Herhangi bir yardım için teşekkürler.

Yanıtlar:


221

Bir sözlük üzerinde yineleme yapmak için birkaç seçeneğiniz vardır.

Sözlüğün kendisini ( for team in league) yinelerseniz, sözlüğün tuşlarını yineliyor olacaksınız. Bir for döngüsü ile döngü oluştururken, dict ( league) üzerinde döngü yapsanız da, ya da league.keys():

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

Ayrıca, üzerinde yineleyerek aynı anda hem anahtarlar hem de değerler üzerinde yineleme yapabilirsiniz league.items():

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

Hatta yineleme sırasında tuple paketinizi açabilirsiniz:

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

43
Python3'ten beri dict.iteritems () kaldırıldı. Onun yerine dict.items () kullanmalısınız
Sergey

14
Python 3'te dict.iterkeys () de kaldırılmıştır. Bunun yerine dict.keys () kullanmalısınız
Nerrve

1
Python 3'te dict.itervalues ​​() da kaldırıldı. Onun yerine dict.values ​​() kullanmalısınız
Zachary Ryan Smith

11

Sözlükleri de kolaylıkla yineleyebilirsiniz:

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: Bir cevabın değerli olduğunu düşündüğünüzde lütfen oy verin (gönderinin sol tarafındaki "yukarı" düğmesini tıklayın)! Bu şekilde topluma da yardımcı oluyorsunuz!
StackExchange saddens dancek

6

Sözlüklerin yerleşik bir işlevi vardır iterkeys().

Deneyin:

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

Sözlük nesneleri, öğeleri üzerinde yineleme yapmanıza olanak tanır. Ayrıca, desen eşleştirme ve __future__sizden ayırma ile işleri biraz basitleştirebilirsiniz.

Son olarak, işleri daha sonra yeniden düzenlemeyi / hata ayıklamayı biraz daha kolaylaştırmak için mantığınızı yazdırmanızdan ayırabilirsiniz.

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

Listeyi anlama işleri kısaltabilir ...

win_percentages = [m**2.0 / (m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.