2015-06-21 22 views
7

Tôi có a = {'foo': 2, 'bar': 3, 'baz': 5 }Chia mỗi giá trị điển python bằng tổng giá trị

Liệu có cách nào tôi có thể nhận a = {'foo': 0.2, 'bar': 0.3, 'baz': 0.5 } trong một dòng? Cần phải phân chia mỗi giá trị bằng tổng giá trị ... Tôi chỉ có thể không làm cho nó thực hiện .. :(

Cảm ơn bạn rất nhiều!

+0

Tại sao 'một dòng'? – Daniel

Trả lời

14

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 totalv 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.

+1

Tôi nghĩ bạn không cần 'total' ở đây' {k: v/sum (a.values ​​(), 0.0) cho k, v trong a.items()} ' – styvane

+2

@ user3100115: trong trường hợp này là' tổng() 'sẽ chạy cho * mỗi cặp khóa-giá trị *, chạy vòng lặp đầy đủ trên tất cả các giá trị mỗi lần. Bạn sẽ tạo ra một vòng lặp N * N thay vì một vòng lặp N. Tôi muốn chọn tuyến tính trên bậc hai bất kỳ lúc nào. –

+0

Cảm ơn rất nhiều Martijn! –

0

tôi đã làm nó bằng cách sử dụng chức năng

a = {'foo': 2, 'bar': 3, 'baz': 5} 
def func1(my_diction): 
    total = 0 
    for i in my_diction: 
     total = total + my_diction[i] 
    for j in my_diction: 
     my_diction[j] = (float)(my_diction[j])/total 
    return my_diction  

print (func1(a)) 
0
def div_d(my_dict): 

    sum_p = sum(my_dict.values()) 

    for i in my_dict: 
     my_dict[i] = float(my_dict[i]/sum_p) 

    return my_dict 

P.S tôi hoàn toàn mới để lập trình nhưng điều này là tốt nhất tôi có thể nghĩ ra.

Các vấn đề liên quan