美文网首页
Python Counter()计数工具

Python Counter()计数工具

作者: Nisen | 来源:发表于2016-11-10 23:51 被阅读2412次

    class collections.Counter([iterable-or-mapping])<a id="sec-1" name="sec-1"></a>

    Counter 是实现的 dict 的一个子类,可以用来方便地计数。

    例子<a id="sec-1-1" name="sec-1-1"></a>

    举个计数的例子,需要统计一个文件中,每个单词出现的次数。实现方法如下

    # 普通青年
    d = {}
    with open('/etc/passwd') as f:
        for line in f:
            for word in line.strip().split(':'):
                if word not in d:
                    d[word] = 1
                else:
                    d[word] += 1
    
    # 文艺青年
    d = defaultdict(int)
       with open('/etc/passwd') as f:
           for line in f:
               for word in line.strip().split(':'):
                   d[word] += 1
    
    # 酷酷青年
    word_counts = Counter()
    with open('/etc/passwd') as f:
        for line in f:
    word_counts.update(line.strip().split(':'))
    

    使用实例<a id="sec-1-2" name="sec-1-2"></a>

    可以像下面例子一样来创建一个 Counter:

    >>> c = Counter()                           # 创建一个新的空counter
    >>> c = Counter('abcasdf')                  # 一个迭代对象生成的counter
    >>> c = Counter({'red': 4, 'yello': 2})      # 一个映射生成的counter
    >>> c = Counter(cats=2, dogs=5)             # 关键字参数生成的counter
    
    # counter 生成counter, 虽然这里并没有什么用
    >>> from collections import Counter
    >>> c = Counter('abcasd')
    >>> c
    Counter({'a': 2, 'c': 1, 'b': 1, 's': 1, 'd': 1})
    >>> c2 = Counter(c)
    >>> c2
    Counter({'a': 2, 'c': 1, 'b': 1, 's': 1, 'd': 1})
    

    因为 Counter 实现了字典的 __missing__ 方法, 所以当访问不存在的key的时候,返回值为0:

    >>> c = Counter(['apple', 'pear'])
    >>> c['orange']
    0
    

    Counter 常用的方法:

    # elements() 按照counter的计数,重复返回元素
    >>> c = Counter(a=4, b=2, c=0, d=-2)
    >>> list(c.elements())
    ['a', 'a', 'a', 'a', 'b', 'b']
    
    # most_common(n) 按照counter的计数,按照降序,返回前n项组成的list; n忽略时返回全部
    >>> Counter('abracadabra').most_common(3)
    [('a', 5), ('r', 2), ('b', 2)]
    
    # subtract([iterable-or-mapping]) counter按照相应的元素,计数相减
    >>> c = Counter(a=4, b=2, c=0, d=-2)
    >>> d = Counter(a=1, b=2, c=3, d=4)
    >>> c.subtract(d)
    >>> c
    Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
    
    # update([iterable-or-mapping]) 不同于字典的update方法,这里更新counter时,相同的key的value值相加而不是覆盖
    # 实例化 Counter 时, 实际也是调用这个方法
    
    
    # Counter 间的数学集合操作
    >>> c = Counter(a=3, b=1, c=5)
    >>> d = Counter(a=1, b=2, d=4)
    >>> c + d                       # counter相加, 相同的key的value相加
    Counter({'c': 5, 'a': 4, 'd': 4, 'b': 3})
    >>> c - d                       # counter相减, 相同的key的value相减,只保留正值的value
    Counter({'c': 5, 'a': 2})
    >>> c & d                       # 交集:  取两者都有的key,value取小的那一个
    Counter({'a': 1, 'b': 1})
    >>> c | d                       # 并集:  汇聚所有的key, key相同的情况下,取大的value
    Counter({'c': 5, 'd': 4, 'a': 3, 'b': 2})
    
    
    # 常见做法:
    sum(c.values())                 # 继承自字典的.values()方法返回values的列表,再求和
    c.clear()                       # 继承自字典的.clear()方法,清空counter
    list(c)                         # 返回key组成的list
    set(c)                          # 返回key组成的set
    dict(c)                         # 转化成字典
    c.items()                       # 转化成(元素,计数值)组成的列表
    Counter(dict(list_of_pairs))    # 从(元素,计数值)组成的列表转化成Counter
    c.most_common()[:-n-1:-1]       # 最小n个计数的(元素,计数值)组成的列表
    c += Counter()                  # 利用counter的相加来去除负值和0的值
    

    Next<a id="sec-2" name="sec-2"></a>

    下一篇将从源码层次剖析collections.Counter的实现, 敬请期待啦!
    参见这儿: http://www.jianshu.com/p/c9eb1b96f13c

    相关文章

      网友评论

          本文标题:Python Counter()计数工具

          本文链接:https://www.haomeiwen.com/subject/vcaxpttx.html