Ітерація ключових значень словника, що відповідає списку в Python


132

Робота в Python 2.7. У мене є словник із назви команд як ключів та кількістю забитих та дозволених для кожної команди як списку значень:

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

Я хотів би мати можливість вводити словник у функцію та переглядати кожну команду (клавіші).

Ось код, який я використовую. Зараз я можу йти лише за командою. Як би я повторив кожну команду та надрукував очікуваний виграш виграшу для кожної команди?

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

Дякуємо за будь-яку допомогу.

Відповіді:


221

У вас є кілька варіантів ітерації над словником.

Якщо ви перейдете до самого словника ( for team in league), ви перейдете до клавіш словника. Під час циклу циклу for for поведінка буде однаковою, чи будете ви переводити цикл на сам dict ( league), або league.keys():

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

Ви також можете повторити і клавіші, і значення одразу, повторивши league.items():

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

Ви навіть можете виконувати розпакування кортежу під час ітерації:

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

43
dict.iteritems () було видалено з Python3. Слід скористатися dict.items () замість цього
Сергій

14
dict.iterkeys () також було видалено в Python 3. Натомість слід використовувати dict.keys ()
Nerrve

1
dict.itervalues ​​() також було видалено в Python 3. Натомість слід використовувати dict.values ​​()
Закарі Райан Сміт

11

Ви також можете легко перебирати словники:

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: Щоразу, коли ви вважаєте, що відповідь гідна, будь ласка, піднесіть заявку (натисніть кнопку "вгору" в лівій частині допису)! Таким чином, ви також допомагаєте громаді!
StackExchange saddens dancek

6

Словники мають вбудовану функцію під назвою iterkeys().

Спробуйте:

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

Об'єкти зі словника дозволяють переглядати їх елементи. Крім того, за допомогою узгодження шаблону та поділу від __future__вас можна трохи спростити речі.

Нарешті, ви можете відокремити свою логіку від друку, щоб зробити речі трохи простішими для рефакторингу / налагодження пізніше.

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

Розуміння списку може скоротити речі ...

win_percentages = [m**2.0 / (m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.