योग मान है, तो एक समझ शब्दकोश का प्रयोग कर एक नया शब्दकोश का निर्माण करने के सामान्यीकृत मूल्यों के साथ:
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) समाधान के साथ समाप्त होता है।
स्रोत
2015-06-21 12:41:25
क्यों 'एक पंक्ति'? – Daniel