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

2024-10-04 03:26:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两本字典。在

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。我的错误在哪里?在


Tags: 方法函数infor字典foodefbar
3条回答

您可以从foobar构建字典并使用列表理解:

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])

输出:

^{pr2}$

你很亲密。问题是你在字典理解中的列表理解。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

或者作为一个更不可读的一行(因为我想看看我是否可以):

^{pr2}$

尽管如此,当您减去float时,您可能仍然会看到一些奇怪的结果。例如,{'Tom': 3.999999999999999}。您可能需要在round调用中包装v - sub_dict.get(k, 0)。在

如果要更新foo中的dict,可以直接执行,因为列表和dict都是不可变的:

def sub(a, b):
    for d1, d2 in zip(a, b):
        for k, v in d2.items():
            d1[k] -= v

任何更改都将反映在您的列表中,该列表仅包含对您的dicst的引用:

^{pr2}$

如您所见,您还需要注意floating-point-arithmetic-issues-and-limitations

相关问题 更多 >