python - 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'}
解决方案
您可以定义自己的函数来添加两个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
循环覆盖,因此它们的最终值是第二个Counter
named中的任何值b
。之所以如此,是因为您还没有准确定义在这种情况下您想要发生的事情。