将dict百分比值超过/低于100%?

时间:2015-05-23 02:00:40

标签: python-2.7

使用python-2.7。我有数百个字典,需要强制百分比,所以它们加起来达到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

我在写一个函数时遇到了麻烦,它似乎工作但有更好的方法吗?

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

使用btest词典的空闲会话

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

2 个答案:

答案 0 :(得分:1)

与上面基本相同的东西,除了这会更新字典并计算一次总和。节省一些内存(没有定义额外的dict),也比dict(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)

答案 1 :(得分:0)

这基本上是这样做的方式,给它们等效的比例加权。有一些细微的变化可能会提高效率:

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

真正做到的就是将sum提升到循环之外,这对于大dict只会非常重要。