许多柜台的联盟

flo*_*ake 3 python counter

找到计数器列表的联合的最佳方法(在可读性和效率方面)是什么?

例如,我的列表可能如下所示:

counters = [Counter({'a': 6, 'b': 3, 'c': 1}),
            Counter({'a': 2, 'b': 5}),
            Counter({'a': 4, 'b': 4}),
            ...]
Run Code Online (Sandbox Code Playgroud)

我想计算联合,即counters[0] | counters[1] | counters[2] | ....

一种方法是这样做:

def counter_union(iterable):
    return functools.reduce(operator.or_, iterable, Counter())
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?

Tim*_*ers 7

善良,Python程序员何时害怕轻松循环?大声笑.

result = Counter()
for c in counters:
    result |= c
Run Code Online (Sandbox Code Playgroud)

在现实生活中确实没有奖品可以将事物压缩成理论上可能的角色.嗯,你有Perl,但不是Python ;-)

后来:根据user2357112的评论,从Python 3.3开始,上面的代码将"就地"联合进入result.也就是说,result真正重用,可能在每次迭代时变大.

在任何拼写中

counters[0] | counters[1] | counters[2] | ...
Run Code Online (Sandbox Code Playgroud)

相反,当计算下一个部分结果时,到目前为止整个部分结果都会被抛弃.这可能 - 或可能不会 - 慢得多.

  • 是的,但这不是偶然的;-) (2认同)