我有两个词典列表。
foo = [{'Tom': 8.2}, {'Bob': 16.7}, {'Mike': 11.6}]
bar = [{'Tom': 4.2}, {'Bob': 6.7}, {'Mike': 10.2}]
a和b的减法应该在foo中更新:
foo = [{'Tom': 4.0}, {'Bob': 10.0}, {'Mike': 1.4}]
现在我尝试了两个循环和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
。哪里是我的错?
答案 0 :(得分:3)
你非常接近。问题是你在词典理解中的列表理解。 mydict[k], mydictcorr[k]
都返回了浮点数,但是你试图迭代它们[x-y for x, y in mydict[k], mydictcorr[k]]
。
这对你有用:
def sub(base, subtract):
corrected = []
for base_dict, sub_dict in zip(base, subtract):
corrected.append({k: v - sub_dict.get(k, 0) for k, v in base_dict.items()})
return corrected
或者作为一个不太可读的单行(因为我想看看我是否可以):
def sub(base, subtract):
return [{k: v - sub_dict.get(k, 0) for k, v in base_dict.items()} for base_dict, sub_dict in zip(base, subtract)]
话虽如此,当您减去浮点数时,您仍可能会看到一些奇怪的结果。例如,{'Tom': 3.999999999999999}
。您可能希望将v - sub_dict.get(k, 0)
包裹在对圆形的调用中。
答案 1 :(得分:0)
您可以从foo
和bar
构建字典并使用列表理解:
a = dict([next(x.iteritems()) for x in foo])
b = dict([next(x.iteritems()) for x in bar])
sub_dict = dict([(key, round(a[key] - b.get(key, 0), 1)) for key in a])
输出:
{'Bob': 10.0, 'Mike': 1.4, 'Tom': 4.0}
答案 2 :(得分:0)
如果你想更新foo
中的dicts你可以直接做,因为列表和dicts都是不可变的:
def sub(a, b):
for d1, d2 in zip(a, b):
for k, v in d2.items():
d1[k] -= v
任何更改都会反映在您的列表中,该列表仅包含您对dicst的引用:
In [2]: foo
Out[2]: [{'Tom': 8.2}, {'Bob': 16.7}, {'Mike': 11.6}]
In [3]: sub(foo, bar)
In [4]: foo
Out[4]: [{'Tom': 3.999999999999999}, {'Bob': 10.0}, {'Mike': 1.4000000000000004}]