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

#python #loops #dictionary

#python #Список #функция #словарь #циклы

Вопрос:

Работа в 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
 

Спасибо за любую помощь.

Ответ №1:

У вас есть несколько вариантов перебора словаря.

Если вы выполняете итерацию по самому словарю ( 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)
 

Комментарии:

1. dict.iteritems() был удален с Python3. Вместо этого вы должны использовать dict.items()

2. dict.iterkeys() также был удален в Python 3. Вместо этого вы должны использовать dict.keys()

3. dict.itervalues() также был удален в Python 3. Вместо этого вы должны использовать dict.values()

4. Как насчет проверки наличия ключа в операторе dict on if ? это тоже одно и то же?

Ответ №2:

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

 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)
 

Комментарии:

1. @BurtonGuster: всякий раз, когда вы считаете ответ достойным, пожалуйста, проголосуйте (нажмите кнопку «вверх» в левой части сообщения)! Таким образом, вы тоже помогаете сообществу!

Ответ №3:

Словари имеют встроенную вызываемую функцию 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
 

Ответ №4:

Объекты словаря позволяют вам перебирать их элементы. Кроме того, с помощью сопоставления с образцом и разделения из __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
 

Ответ №5:

Понимание списка может сократить время…

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