我有两本字典。在
foo = [{'Tom': 8.2}, {'Bob': 16.7}, {'Mike': 11.6}]
bar = [{'Tom': 4.2}, {'Bob': 6.7}, {'Mike': 10.2}]
a和b的减法应在foo中更新:
^{pr2}$现在我用两个循环和zip
-函数尝试了这个方法:
def sub(a,b):
for mydict,mydictcorr in zip(a,b):
{k:[x-y for x, y in mydict[k], mydictcorr[k]] for k in mydict}
return mydict
print sub(foo,bar)
我得到一个TypeError: 'float' object is not iterable
。我的错误在哪里?在
您可以从
foo
和bar
构建字典并使用列表理解:输出:
^{pr2}$你很亲密。问题是你在字典理解中的列表理解。
mydict[k], mydictcorr[k]
都返回了float,但您试图迭代它们[x-y for x, y in mydict[k], mydictcorr[k]]
。在这将对您有用:
或者作为一个更不可读的一行(因为我想看看我是否可以):
^{pr2}$尽管如此,当您减去float时,您可能仍然会看到一些奇怪的结果。例如,
{'Tom': 3.999999999999999}
。您可能需要在round调用中包装v - sub_dict.get(k, 0)
。在如果要更新
foo
中的dict,可以直接执行,因为列表和dict都是不可变的:任何更改都将反映在您的列表中,该列表仅包含对您的dicst的引用:
^{pr2}$如您所见,您还需要注意floating-point-arithmetic-issues-and-limitations
相关问题 更多 >
编程相关推荐