首页 > 解决方案 > collections.Counter,有没有办法避免添加字符串值?

问题描述

例如,我有两本字典。

>>> dict_a = {'total': 20, 'remaining': 10, 'group': 'group_a'}
>>> dict_b = {'total': 30, 'remaining': 29, 'group': 'group_a'}

我正在使用collections.Counter进行计数。

>>> dict_c = Counter()
>>> dict_c.update(Counter(dict_a))
>>> dict_c.update(Counter(dict_b))
>>> print(dict_c)
{'toal': 50, 'remaining': 39, 'group': 'group_agroup_a'}

有没有办法只添加整数类型值?即,当添加时,它只添加整数类型值。

>>> print(dict_c)
>>> {'toal': 50, 'remaining': 39, 'group': 'group_a'}

标签: pythondictionarycollectionscounter

解决方案


您可以定义自己的函数来添加两个Counter对象,就像您的问题中的对象一样。这是必要的,因为添加Counter对象的默认方法无法像您放入对象那样处理其中的非数字值。

from collections import Counter

def add_counters(a, b):
    """ Add numerical counts from two Counters. """
    if not isinstance(a, Counter) or not isinstance(a, Counter):
        return NotImplemented
    result = Counter()
    for elem, count in a.items():
        newcount = count + b[elem]
        try:
            if newcount > 0:
                result[elem] = newcount
        except TypeError:
            result[elem] = count  # Just copy value.

    for elem, count in b.items():
        if elem not in a and count > 0:
            result[elem] = count

    return result


dict_a = {'total': 20, 'remaining': 10, 'group': 'group_a'}
dict_b = {'total': 30, 'remaining': 29, 'group': 'group_a'}
dict_c = add_counters(Counter(dict_a), Counter(dict_b))
print(dict_c)  # -> Counter({'total': 50, 'remaining': 39, 'group': 'group_a'})

Counter请注意,上述内容可能并不完全正确,因为第一个参数中刚刚复制到结果中的任何非数字项a都可能被第二个for循环覆盖,因此它们的最终值是第二个Counternamed中的任何值b。之所以如此,是因为您还没有准确定义在这种情况下您想要发生的事情。


推荐阅读