#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]]