python 中的计数器汇总列表
Summing list of counters in python
我希望对 python 中的计数器列表求和。例如求和:
counter_list = [Counter({"a":1, "b":2}), Counter({"b":3, "c":4})]
给予Counter({'b': 5, 'c': 4, 'a': 1})
我可以得到下面的代码来做求和:
counter_master = Counter()
for element in counter_list:
counter_master = counter_master + element
但我很困惑为什么 counter_master = sum(counter_list)
会导致错误 TypeError: unsupported operand type(s) for +: 'int' and 'Counter'
?既然可以将计数器加在一起,为什么不能对它们求和?
sum
函数有可选的 start 参数,默认为 0。引用链接页面:
sum(iterable[, start])
Sums start and the items of an iterable from left to right and returns
the total
将 start 设置为(空)Counter
对象以避免 TypeError
:
In [5]: sum(counter_list, Counter())
Out[5]: Counter({'b': 5, 'c': 4, 'a': 1})
根据我的经验,此版本速度更快。这是 O(log(n)).
的上限
def sum_counters(counter_list):
'''
Recursive counter with a O(log(n)) Complexity
'''
if len(counter_list) > 10:
counter_0 = sum_counters(counter_list[:int(len(counter_list)/2)])
counter_1 = sum_counters(counter_list[int(len(counter_list)/2):])
return sum([counter_0, counter_1], Counter())
else:
return sum(counter_list, Counter())
global_counter = sum_counters(counter_list)
我希望对 python 中的计数器列表求和。例如求和:
counter_list = [Counter({"a":1, "b":2}), Counter({"b":3, "c":4})]
给予Counter({'b': 5, 'c': 4, 'a': 1})
我可以得到下面的代码来做求和:
counter_master = Counter()
for element in counter_list:
counter_master = counter_master + element
但我很困惑为什么 counter_master = sum(counter_list)
会导致错误 TypeError: unsupported operand type(s) for +: 'int' and 'Counter'
?既然可以将计数器加在一起,为什么不能对它们求和?
sum
函数有可选的 start 参数,默认为 0。引用链接页面:
sum(iterable[, start])
Sums start and the items of an iterable from left to right and returns the total
将 start 设置为(空)Counter
对象以避免 TypeError
:
In [5]: sum(counter_list, Counter())
Out[5]: Counter({'b': 5, 'c': 4, 'a': 1})
根据我的经验,此版本速度更快。这是 O(log(n)).
的上限def sum_counters(counter_list):
'''
Recursive counter with a O(log(n)) Complexity
'''
if len(counter_list) > 10:
counter_0 = sum_counters(counter_list[:int(len(counter_list)/2)])
counter_1 = sum_counters(counter_list[int(len(counter_list)/2):])
return sum([counter_0, counter_1], Counter())
else:
return sum(counter_list, Counter())
global_counter = sum_counters(counter_list)