如何将 N 添加到计数器的每个值? - python
How to add N to every value of a Counter? - python
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})
是否有任何其他方法可以为计数器中的所有值实现相同的 +N?
您可以使用相同的键创建一个新的计数器,并且只有增量然后将其与原始值相加:
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})
使用默认值 +N
的 collections.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})
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})
是否有任何其他方法可以为计数器中的所有值实现相同的 +N?
您可以使用相同的键创建一个新的计数器,并且只有增量然后将其与原始值相加:
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})
使用默认值 +N
的 collections.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})