Перебирая ключевые значения словаря, соответствующие списку в Python

132

Работает в Python 2.7. У меня есть словарь с названиями команд в качестве ключей и количеством запусков, набранных и разрешенных для каждой команды, в качестве списка значений:

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

Я хотел бы иметь возможность передать словарь в функцию и перебирать каждую команду (ключи).

Вот код, который я использую. Сейчас я могу ходить только по команде. Как мне перебрать каждую команду и распечатать ожидаемый win_percentage для каждой команды?

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 поведение будет одинаковым независимо от того, перебираете ли вы сам 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)
StackExchange грустит танец
источник
@BurtonGuster: Всякий раз, когда вы считаете, что ответ достойный, пожалуйста, проголосуйте за (нажмите кнопку «вверх» в левой части сообщения)! Таким образом, вы тоже помогаете сообществу!
StackExchange печально танцует
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]]
Вениамин
источник