2015-05-23 50 views
1

使用python-2.7。我有數百個字典,需要強制百分比,所以他們加起來達到100%。下面的例子。符合百分比值到100%?

atest = {'8P00WW': 0.5, '8P00WV': 0.2, '8P032I': 0.2, '8P00C8': 0.1} #total: 1.0 
btest = {'8P0D37': 0.3, '8P0B5C': 0.25, '8P0CMG': 0.2}    #total: .75 
ctest = {'8P03KK': 0.9, '8P0DVD': 0.4, '8P05JV': 0.05}    #total: 1.35 

我在編寫函數時看了一眼,似乎有效,但有沒有更好的方法?使用BTEST字典

>>> bresult = fit2one(btest) 
>>> bresult 
{'8P0B5C': 0.3333333333333333, '8P0D37': 0.39999999999999997, '8P0CMG': 0.26666666666666666}  
>>> sum(bresult.values()) 
1.0 

回答

1

與上述內容基本相同,除了更新字典並計算一次和。保存一些內存(沒有額外的字典定義),也比字典(K,V/S)更便宜。但當然,這隻對大字典或如果你經常這樣做很重要。

atest = {'8P00WW': 0.5, '8P00WV': 0.2, '8P032I': 0.2, '8P00C8': 0.1} #total: 1.0 
btest = {'8P0D37': 0.3, '8P0B5C': 0.25, '8P0CMG': 0.2}    #total: .75 
ctest ={'8P03KK': 0.9, '8P0DVD': 0.4, '8P05JV': 0.05}    #total: 1.35 

def fit_to_one(d): 
    s = sum(d.values()) 
    for k,v in d.items(): 
     d[k] = v/s 

    return d 

print fit_to_one(atest) 
print fit_to_one(btest) 
print fit_to_one(ctest) 
0

這主要是做到這一點的方式,給他們相當的比例權重

def fit2one(dict): 
''' return a dictionary where values add up to 1 ''' 
    output = {} 
    for k, v in (dict.items()): 
     output[k] = v/sum(dict.values()) 
    return output 

空閒會話。有一些小的變化,可能使這更有效:

def fit2one(d): 
    s = sum(d.values()) 
    return dict((k, v/s) for k, v in d.items()) 

所有這一切確實是解除sum圈外,這將唯一真正關注的大型dict秒。