2011-09-13 44 views
88

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

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

Tôi muốn để có thể nuôi sống từ điển vào một chức năng và lặp qua mỗi đội (chìa khóa).

Đây là mã tôi đang sử dụng. Ngay bây giờ, tôi chỉ có thể đi theo nhóm. Làm cách nào để tôi lặp lại từng đội và in tỷ lệ thắng 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 bạn đã được trợ giúp.

+1

'dic.items() '... – JBernardo

Trả lời

141

Bạn có nhiều lựa chọn cho iterating trên một cuốn từ điển.

Nếu bạn lặp lại chính từ điển (for team in league), bạn sẽ được lặp qua 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 nếu bạn lặp lại chính tả(), league.keys() hoặc league.iterkeys(). dict.iterkeys() nói chung là thích hợp hơn vì nó là rõ ràng và hiệu quả:

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

Bạn cũng có thể lặp lại trên cả các phím và các giá trị cùng một lúc bằng cách duyệt qua league.items() hoặc league.iteritems():

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

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

for team, (runs_scored, runs_allowed) in league.iteritems(): 
    runs_scored = float(runs_scored) 
    runs_allowed = float(runs_allowed) 
+28

dict.iteritems() đã bị xóa kể từ Python3. Bạn nên sử dụng dict.items() thay vì – Sergey

+11

dict.iterkeys() cũng được loại bỏ bằng Python 3. Bạn nên sử dụng dict.keys() để thay thế – Nerrve

8

Bạn có thể dễ dàng duyệt qua từ điển, quá:

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) 
+0

Thanks for the help! Mã làm việc rất tốt. –

+0

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

5

điển đã tích hợp sẵn chức năng gọi iterkeys().

Hãy 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 
+0

Cảm ơn sự giúp đỡ! –

4

Đối tượng từ điển cho phép bạn lặp qua các mục của chúng. Ngoài ra, với kết hợp mẫu và phân chia từ __future__ bạn có thể làm đơ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 mình ra khỏi bản in để làm cho mọi việc dễ dàng hơn trong việc 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 
2

Danh sách hiểu biết có thể rút ngắn điều ...

win_percentages = [m**2.0/(m**2.0 + n**2.0) * 100 for m, n in [a[i] for i in NL_East]] 
Các vấn đề liên quan