从另一个词典列表中减去词典列表中的值

Geo*_*Eki 5 python dictionary loops python-2.7

我有两个词典列表.

foo = [{'Tom': 8.2}, {'Bob': 16.7}, {'Mike': 11.6}]
bar = [{'Tom': 4.2}, {'Bob': 6.7}, {'Mike': 10.2}]
Run Code Online (Sandbox Code Playgroud)

应该在foo中更新a和b的减法:

foo = [{'Tom': 4.0}, {'Bob': 10.0}, {'Mike': 1.4}]
Run Code Online (Sandbox Code Playgroud)

现在我尝试了两个循环和zip-function:

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)
Run Code Online (Sandbox Code Playgroud)

我得到了TypeError: 'float' object is not iterable.哪里是我的错?

Mor*_*app 3

你们非常亲密。问题是您在字典理解中的列表理解。mydict[k], mydictcorr[k]都返回 float,但您试图迭代它们[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
Run Code Online (Sandbox Code Playgroud)

或者作为可读性差得多的单行文字(因为我想看看我是否可以):

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)]
Run Code Online (Sandbox Code Playgroud)

话虽如此,当你减去浮点数时,你可能仍然会看到一些奇怪的结果。例如,{'Tom': 3.999999999999999}。您可能想要包含v - sub_dict.get(k, 0)对 round 的调用。