web-dev-qa-db-ja.com

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

助けてくれてありがとう。

114
Burton Guster

辞書を反復処理するためのオプションがいくつかあります。

辞書自体(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)

繰り返しながらTupleのアンパックを実行することもできます。

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

辞書も簡単に反復できます:

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)
10
dancek

辞書には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
6
HodofHod

辞書オブジェクトを使用すると、アイテムを繰り返し処理できます。また、パターンマッチングと__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
Swiss

リストの理解は物事を短縮することができます...

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