python collections中Counter类

Counter是dict的一个子类,因此具有dict的属性与方法。如常用的iteritems, items, get, pop。

1
class Counter(dict):

如果Key不存在,将返回0,不会引发KeyError异常。

1
2
def __mising__(self, key):
return 0

elements()

返回一个生成器,需要用到 itertools 标准库中的chain,starmap,repeat等方法,itertools是关于迭代器的工具。

1
2
def elements(self):
return _chain.from_iterable(_starmap(_repeat, self.iteritems()))

most_common()

列出前n个出现次数最多的元素。如果n是默认值(None),将列出所有元素。sorted 是内建函数,返回有序列表。heapq 是关于数据结构堆的操作。

1
2
3
4
def most_common(self, n=None):
if n is None:
return sorted(self.iteritems(), key=_itemgetter(1), reverse=True)
return _heapq.nlargest(n, self.iteritems(), key=_itemgetter(1))

update()

根据参数,增加key的计数。无论输入还是输出,value都允许是负值。
单从args参数来看,如果args[1]是一个Counter()对象,则在此对象的基础上进行统计。否则,从0计数。
self_get(elem, 0),如果key不存在的话,则记为0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def update(*args, **kwds):
if not args:
raise TypeError("descriptor 'update' of 'Counter' object "
"needs an argument")
self = args[0]
args = args[1:]
if len(args) > 1:
raise TypeError('expected at most 1 arguments, got %d' % len(args))
iterable = args[0] if args else None
if iterable is not None:
if isinstance(iterable, Mapping):
if self:
self_get = self.get
for elem, count in iterable.iteritems():
self[elem] = self_get(elem, 0) + count
else:
super(Counter, self).update(iterable) # fast path when counter is empty
else:
self_get = self.get
for elem in iterable:
self[elem] = self_get(elem, 0) + 1
if kwds:
self.update(kwds)

substract()

与update()相反,减少key的计数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def subtract(*args, **kwds):
if not args:
raise TypeError("descriptor 'subtract' of 'Counter' object "
"needs an argument")
self = args[0]
args = args[1:]
if len(args) > 1:
raise TypeError('expected at most 1 arguments, got %d' % len(args))
iterable = args[0] if args else None
if iterable is not None:
self_get = self.get
if isinstance(iterable, Mapping):
for elem, count in iterable.items():
self[elem] = self_get(elem, 0) - count
else:
for elem in iterable:
self[elem] = self_get(elem, 0) - 1
if kwds:
self.subtract(kwds)

copy

返回对象的一个浅拷贝。self.class

1
2
3
def copy(self):
'Return a shallow copy.'
return self.__class__(self)