Iterando sobre valores-chave de dicionário correspondentes à lista em Python

132

Trabalhando em Python 2.7. Eu tenho um dicionário com nomes de equipe como as chaves e a quantidade de execuções marcadas e permitidas para cada equipe como a lista de valores:

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

Eu gostaria de poder alimentar o dicionário em uma função e iterar sobre cada equipe (as teclas).

Aqui está o código que estou usando. No momento, só posso ir equipe por equipe. Como eu itera sobre cada equipe e imprime o win_percentage esperado para cada equipe?

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

Obrigado por qualquer ajuda.

Burton Guster
fonte

Respostas:

221

Você tem várias opções para iterar sobre um dicionário.

Se você iterar sobre o próprio dicionário ( for team in league), estará iterando sobre as teclas do dicionário. Ao fazer um loop com um loop for, o comportamento será o mesmo se você fizer um loop sobre o próprio dict ( league) ou league.keys():

for team in league.keys():
    runs_scored, runs_allowed = map(float, league[team])

Você também pode iterar sobre as chaves e os valores de uma só vez, iterando sobre league.items():

for team, runs in league.items():
    runs_scored, runs_allowed = map(float, runs)

Você pode até descompactar sua tupla enquanto itera:

for team, (runs_scored, runs_allowed) in league.items():
    runs_scored = float(runs_scored)
    runs_allowed = float(runs_allowed)
Andrew Clark
fonte
43
O dict.iteritems () foi removido desde o Python3. Você deve usar dict.items () em vez disso
Sergey
14
O dict.iterkeys () também foi removido no Python 3. Você deve usar o dict.keys () em vez disso
Nerrve
1
dict.itervalues () também foi removido em Python 3. Você deve usar dict.values () em vez
Zachary Ryan Smith
11

Você também pode facilmente iterar nos dicionários:

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 entristece dancek
fonte
@BurtonGuster: Sempre que você achar uma resposta digna, faça um voto positivo (clique no botão "para cima" no lado esquerdo da postagem)! Dessa forma, você também está ajudando a comunidade!
StackExchange saddens dancek 14/09/11
6

Os dicionários possuem uma função integrada chamada iterkeys() .

Experimentar:

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
Hod - Exército de Mônica
fonte
5

Os objetos de dicionário permitem que você itere sobre seus itens. Além disso, com a correspondência de padrões e a divisão de__future__ você pode simplificar um pouco as coisas.

Finalmente, você pode separar sua lógica da sua impressão para facilitar um pouco as coisas de refatorar / depurar posteriormente.

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
suíço
fonte
4

A compreensão da lista pode encurtar as coisas ...

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