2015-06-21 67 views
7

将每个Python字典值我有 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()与浮动婆int初始值,以防止/运营商在Python 2中使用分区划分,如果totalv都是整数,将会发生这种情况。

在Python 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()循环遍历字典中的所有N个项目,因此您最终将得到一个二次O(N^2)解决方案,而不是您的问题的O(N)解决方案。

+1

我认为你在这里不需要'total'这里''k:v/sum(a.values(),0.0)对于a.items()中的k,v'' – styvane

+2

@ user3100115:在这种情况下'sum ()'会为*每个键值对*运行,每次运行一个完整的循环遍历所有值。你会产生一个N * N循环而不是N循环。我会在任何时候选择线性二次方。 –

+0

非常感谢Martijn! –

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 

P.S我完全新的节目,但是这是我能想到的关闭是最好的。