python - 如何在未知长度的计数器列表中使用并集和交集?

标签 python union counter operator-keyword

<分区>

鉴于我知道有多少个计数器,可以很容易地硬核 | 运算符以获得计数器的并集,例如:

>>> from collections import Counter
>>> x = Counter([('a'), ('a', 'bc'), ('a', 'bc'), ('xyz', 'hooli')])
>>> y = Counter([('a'), ('a'), ('a'), ('asd', 'asd')])
>>> z = Counter([('a'), ('a'), ('a'), ('a'), ('a', 'bc')])
>>> x | y | z
Counter({'a': 4, ('a', 'bc'): 2, ('asd', 'asd'): 1, ('xyz', 'hooli'): 1})

但是如果我有一个计数器列表作为函数的输入,我该如何获得联合?

我是否必须遍历每个计数器然后执行合并?例如

>>> xyz = [x,y,z]
>>> def counter_union(counters):
...     union = Counter()
...     for c in counters:
...             union = union | c
...     return union
... 
>>> counter_union(xyz)
Counter({'a': 4, ('a', 'bc'): 2, ('asd', 'asd'): 1, ('xyz', 'hooli'): 1})

还有其他方法吗?

最佳答案

你可以使用reduce:

>>> from functools import reduce
>>> from operator import or_
>>> reduce(or_, [x, y, z])
Counter({'a': 4, ('a', 'bc'): 2, ('xyz', 'hooli'): 1, ('asd', 'asd'): 1})

或者如果您不想导入 or_:

>>> reduce(lambda a,b: a|b, [x, y, z])
Counter({'a': 4, ('a', 'bc'): 2, ('xyz', 'hooli'): 1, ('asd', 'asd'): 1})

(类似and_/&。)

关于python - 如何在未知长度的计数器列表中使用并集和交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34560378/

相关文章:

python - 如何将现有数据格式化为 python 3.5 中 csv 文件的列

mysql with OR 语句返回全表扫描

mysql - 订购两个合并查询

JavaScript 计时器不停止

python - 计算重复列表的频率 - 在列表列表中

python - Pandas 数据框进入数据库,类型错误: Required argument 'database' (pos 1) not found

python - 关于从 txt 文件数据绘图的问题

python - 你知道一个很棒的用于操作日期的 Python 库吗?

sql - 单独放置 WHERE 语句以使 UNION 函数起作用

python - 真正快速地计算双字母组(有或没有多处理) - python