Итерирование над ключевыми значениями словаря, соответствующими списку в 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)
Ответ 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)
Ответ 3
Словари имеют встроенную функцию с именем iterkeys()
.
Try:
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]]