代码之家  ›  专栏  ›  技术社区  ›  alvas

如何在未知长度的计数器列表中使用并集和交集?[副本]

  •  1
  • alvas  · 技术社区  · 9 年前

    鉴于我知道有多少计数器,可以很容易地将 | 运算符获取计数器的联合,例如:

    >>> 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})
    

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

    我必须循环每个计数器,然后执行并集吗?例如。

    >>> 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})
    

    还有别的办法吗?

    1 回复  |  直到 9 年前
        1
  •  4
  •   DSM    9 年前

    你可以使用 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_ / & .)