Sum các giá trị, sau đó sử dụng một sự hiểu biết từ điển để tạo ra một từ điển mới với các giá trị bình thường:
total = sum(a.itervalues(), 0.0)
a = {k: v/total for k, v in a.iteritems()}
Bạn có thể bóp đó vào một lớp lót, nhưng nó sẽ không được như có thể đọc được:
a = {k: v/total for total in (sum(a.itervalues(), 0.0),) for k, v in a.iteritems()}
tôi đưa sum()
với po nổi int giá trị bắt đầu để ngăn chặn các nhà điều hành /
sử dụng phân chia tầng trong Python 2, điều này sẽ xảy ra nếu total
và v
cả hai sẽ là số nguyên.
Trong Python 3, thả iter*
tiền tố:
a = {k: v/total for total in (sum(a.values()),) for k, v in a.items()}
Lưu ý rằng bạn làm không muốn sử dụng {k: v/sum(a.values()) for k, v in a.items()}
đây; biểu thức giá trị được thực hiện cho mỗi lần lặp trong vòng lặp hiểu, tính toán lại sum()
lặp đi lặp lại. Các vòng sum()
trên tất cả các mục N trong từ điển, do đó bạn kết thúc với giải pháp O (N^2) bậc hai thay vì giải pháp O (N) cho vấn đề của bạn.
Nguồn
2015-06-21 12:41:25
Tại sao 'một dòng'? – Daniel