使用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
答案 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
只会非常重要。