【问题标题】:How to add N to every value of a Counter? - python如何将 N 添加到计数器的每个值? - Python
【发布时间】:2015-08-02 12:04:33
【问题描述】:

Counter 对象是否有任何等效于 numpy ufunc 的方法?

例如,要将 N 加到计数器中的所有值中,我必须这样做:

>>> from collections import Counter
>>> x = Counter(['foo', 'foo', 'bar', 'bar'])
>>> n = 2
>>> y = Counter({k:v+n for k,v in x.items()})
>>> x
Counter({'foo': 2, 'bar': 2})
>>> y
Counter({'foo': 4, 'bar': 4})

给定 1 万亿个密钥,肯定会比使用numpy 花费更长的时间:

>>> import numpy as np
>>> x = Counter(['foo', 'foo', 'bar', 'bar'])
>>> k, v = zip(*x.items())
>>> n = 2
>>> _v = np.array(v) + n
>>> y = Counter(dict(zip(k, list(_v))))
>>> y
Counter({'foo': 4, 'bar': 4})

还有其他方法可以为 Counter 中的所有值实现相同的 +N 吗?

【问题讨论】:

  • 使用一个简单的循环并更新同一个 Counter dict 中的值,创建另一个 Counter 或简单的 dict 将导致另一个具有 1 万亿键的中间字典。

标签: python numpy dictionary counter


【解决方案1】:

您可以使用相同的键创建一个新的计数器,只有增量然后与原来的相加:

increment = Counter(dict.fromkeys(x, n))
y = x + increment

并不是Counter 对象适合数万亿个键;如果您的数据集那么大,请考虑使用不同的工具,例如数据库。

演示:

>>> from collections import Counter
>>> x = Counter(['foo', 'foo', 'bar', 'bar'])
>>> n = 2
>>> x + Counter(dict.fromkeys(x, n))
Counter({'foo': 4, 'bar': 4})
>>> y = Counter(['foo', 'foo', 'bar', 'bar', 'spam'])
>>> y + Counter(dict.fromkeys(y, n))
Counter({'foo': 4, 'bar': 4, 'spam': 3})

【讨论】:

    【解决方案2】:

    使用默认值为+Ncollections.defaultdict 怎么样?

    >>> from collections import defaultdict
    >>> x = defaultdict(lambda: 2)  # +N = +2
    >>> for key in ['foo', 'foo', 'bar', 'bar']:
    ...     x[key] += 1
    ...
    >>> x
    defaultdict(<function <lambda> at 0x0000000002A4D128>, {'foo': 4, 'bar': 4})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2021-04-12
      • 1970-01-01
      • 2019-09-26
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多