Lặp lại các giá trị chính của từ điển Tương ứng với danh sách trong Python


132

Làm việc trong Python 2.7. Tôi có một từ điển với tên nhóm là các khóa và số lần chạy được ghi và cho phép cho mỗi nhóm làm danh sách giá trị:

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

Tôi muốn có thể đưa từ điển vào một chức năng và lặp lại qua từng nhóm (các phím).

Đây là mã tôi đang sử dụng. Ngay bây giờ, tôi chỉ có thể đi theo đội. Làm thế nào tôi lặp lại qua từng đội và in win_percentage dự kiến ​​cho mỗi đội?

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

Cảm ơn vì bất kì sự giúp đỡ.

Câu trả lời:


221

Bạn có một số tùy chọn để lặp qua một từ điển.

Nếu bạn lặp lại từ điển chính nó ( for team in league), bạn sẽ lặp lại các phím của từ điển. Khi lặp với vòng lặp for, hành vi sẽ giống nhau cho dù bạn lặp qua chính dict ( league) hay league.keys():

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

Bạn cũng có thể lặp lại cả khóa và giá trị cùng một lúc bằng cách lặp lại league.items():

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

Bạn thậm chí có thể thực hiện giải nén tuple của mình trong khi lặp:

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

43
dict.iteritems () đã bị xóa kể từ Python3. Thay vào đó, bạn nên sử dụng dict.items ()
Serge

14
dict.iterkeys () cũng đã bị xóa trong Python 3. Thay vào đó, bạn nên sử dụng dict.keys ()
Nerrve

1
dict.itervalues ​​() cũng đã bị xóa trong Python 3. Bạn nên sử dụng dict.values ​​() thay vào đó
Zachary Ryan Smith

11

Bạn cũng có thể dễ dàng lặp lại từ điển:

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)

@BurtonGuster: Bất cứ khi nào bạn nghĩ rằng một câu trả lời xứng đáng, vui lòng upvote (nhấp vào nút "lên" ở bên trái của bài đăng)! Bằng cách đó, bạn cũng đang giúp cộng đồng!
StackExchange làm buồn nhảy dancek

6

Từ điển có một chức năng được xây dựng gọi là iterkeys().

Thử:

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

5

Đối tượng từ điển cho phép bạn lặp đi lặp lại trên các mục của họ. Ngoài ra, với kết hợp mẫu và phân chia từ __future__bạn có thể đơn giản hóa mọi thứ một chút.

Cuối cùng, bạn có thể tách logic của bạn khỏi quá trình in của bạn để làm cho mọi thứ dễ dàng hơn một chút để tái cấu trúc / gỡ lỗi sau này.

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

4

Danh sách hiểu có thể rút ngắn mọi thứ ...

win_percentages = [m**2.0 / (m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.