将每个Python字典值我有 a = {'foo': 2, 'bar': 3, 'baz': 5 }
由总价值
反正我可以用一个线得到a = {'foo': 0.2, 'bar': 0.3, 'baz': 0.5 }
?需要除以总值每个值...我只是不能把它做.. :(
太谢谢你了!
将每个Python字典值我有 a = {'foo': 2, 'bar': 3, 'baz': 5 }
由总价值
反正我可以用一个线得到a = {'foo': 0.2, 'bar': 0.3, 'baz': 0.5 }
?需要除以总值每个值...我只是不能把它做.. :(
太谢谢你了!
值相加,然后使用字典理解,产生一个新的字典与标准值:
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中使用分区划分,如果total
和v
都是整数,将会发生这种情况。
在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)解决方案。
我认为你在这里不需要'total'这里''k:v/sum(a.values(),0.0)对于a.items()中的k,v'' – styvane
@ user3100115:在这种情况下'sum ()'会为*每个键值对*运行,每次运行一个完整的循环遍历所有值。你会产生一个N * N循环而不是N循环。我会在任何时候选择线性二次方。 –
非常感谢Martijn! –
我做到了使用功能
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))
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我完全新的节目,但是这是我能想到的关闭是最好的。
为什么'一条线'? – Daniel