python collections中Counter类

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

class Counter(dict):

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

def __mising__(self, key):
    return 0

elements()

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

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

most_common()

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

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。

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的计数。

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 指 <class 'collections.Counter'>。

def copy(self):
    'Return a shallow copy.'
    return self.__class__(self)
posted @ 2015-11-19 21:07  山月水风  阅读(791)  评论(0编辑  收藏  举报