2015-06-21 9 views
7

द्वारा प्रत्येक अजगर शब्दकोश मूल्य विभाजित मैं a = {'foo': 2, 'bar': 3, 'baz': 5 }कुल मूल्य

है वहाँ वैसे भी मैं एक पंक्ति में a = {'foo': 0.2, 'bar': 0.3, 'baz': 0.5 } प्राप्त कर सकते हैं है? विभाजित करने के लिए कुल मूल्य द्वारा प्रत्येक मान ... मैं सिर्फ यह नहीं किया प्राप्त कर सकते हैं की आवश्यकता है .. :(

बहुत बहुत शुक्रिया!

+0

क्यों 'एक पंक्ति'? – Daniel

उत्तर

14

योग मान है, तो एक समझ शब्दकोश का प्रयोग कर एक नया शब्दकोश का निर्माण करने के सामान्यीकृत मूल्यों के साथ:

total = sum(a.itervalues(), 0.0) 
a = {k: v/total for k, v in a.iteritems()} 

आप समेट सकते हैं एक लाइनर में है कि है, लेकिन यह के रूप में पढ़ने योग्य नहीं होगा:

a = {k: v/total for total in (sum(a.itervalues(), 0.0),) for k, v in a.iteritems()} 

मैं एक अस्थायी पो साथ sum() दिया / ऑपरेटर को पायथन 2 में फर्श डिवीजन का उपयोग करने से रोकने के लिए int प्रारंभिक मान, जो total और v दोनों पूर्णांक होंगे।

अजगर 3 में, iter* उपसर्गों ड्रॉप:

a = {k: v/total for total in (sum(a.values()),) for k, v in a.items()} 

ध्यान दें कि आप ऐसा करेंगे नहीं यहाँ {k: v/sum(a.values()) for k, v in a.items()} उपयोग करना चाहते हैं; मूल्य अभिव्यक्ति को समझने के लिए प्रत्येक पुनरावृत्ति के लिए निष्पादित किया जाता है, sum() बार-बार पुन: गणना करता है। sum() शब्दकोश में सभी एन आइटमों पर loops, तो आप अपनी समस्या के लिए ओ (एन) समाधान के बजाय एक वर्गिक ओ (एन^2) समाधान के साथ समाप्त होता है।

+1

मुझे लगता है कि आपको 'कुल' की आवश्यकता नहीं है '{k: v/sum (a.values ​​(), 0.0) k, v में a.items()} ' – styvane

+2

@ user3100115: किस मामले में' sum() 'प्रत्येक कुंजी-मूल्य जोड़ी * के लिए * प्रत्येक बार सभी मानों पर एक पूर्ण लूप चलाएगा। आप एन लूप की बजाय एन * एन लूप का उत्पादन करेंगे। मैं किसी भी समय quadratic पर रैखिक उठाऊंगा। –

+0

बहुत बहुत धन्यवाद मार्टिजन! –

0

मैं एक समारोह

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 

पी.एस मैं पूरी तरह प्रोग्रामिंग करने के लिए नया हूँ, लेकिन यह सबसे अच्छा मैं बंद सोच सकता है का उपयोग करते हुए ऐसा किया।

संबंधित मुद्दे