zoukankan      html  css  js  c++  java
  • python 标准类库-数据类型之集合-容器数据类型

    标准类库-数据类型之集合-容器数据类型

     

    by:授客 QQ1033553122

    Counter对象

    例子

    >>> from collections import Counter

    >>> cnt = Counter()

    >>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:

    cnt[word]  += 1  # 等同 cnt[word] = cnt[word] + 1

     

    cnt[word] 每个list元素出现的次数,但是这里相加时会自动去掉重复统计

    >>> cnt

    Counter({'blue': 3, 'red': 2, 'green': 1})

     

    test.txt内容如下

    the and  to of you a my hamlet in

    the and  to of you a my hamlet in

    the and  to of you a my hamlet in

    the to of you a my hamlet in

    the of you a my hamlet in

    the  you a my hamlet in

    the  a my hamlet in

    the  my hamlet in

    the  hamlet in

    the  in

    in

    good by 2016

    shouke 2017

    1099

    study python Counter

     

    >>> import re

     

    >>> words = re.findall(r'w+', open('d:\test.txt').read().lower())

    >>> print(words)

    ['the', 'and', 'to', 'of', 'you', 'a', 'my', 'hamlet', 'in', 'the', 'and', 'to', 'of', 'you', 'a', 'my', 'hamlet', 'in', 'the', 'and', 'to', 'of', 'you', 'a', 'my', 'hamlet', 'in', 'the', 'to', 'of', 'you', 'a', 'my', 'hamlet', 'in', 'the', 'of', 'you', 'a', 'my', 'hamlet', 'in', 'the', 'you', 'a', 'my', 'hamlet', 'in', 'the', 'a', 'my', 'hamlet', 'in', 'the', 'my', 'hamlet', 'in', 'the', 'hamlet', 'in', 'the', 'in', 'in', 'good', 'by', '2016', 'shouke', '2017', '1099', 'study', 'python', 'counter']

    >>> Counter(words).most_common(10)

    [('in', 11), ('the', 10), ('hamlet', 9), ('my', 8), ('a', 7), ('you', 6), ('of', 5), ('to', 4), ('and', 3), ('2016', 1)]

     

    说明:w 只匹配字母和数字字符

     

    类说明

    class collections.Counter([iterable-or-mapping])

    Counter,用于统计哈希对象的dict子类,是一个无序集合,把被统计元素存储为字典的键,而把对应元素出现的次数存储为字典的值。

     

    可统计可迭代对象(iterable)、其它mapping对象counter中的元素

    >>> c = Counter() # 空的 counter

    >>> c

    Counter()

     

    >>> c = Counter('gallahad')  # 通过可迭代对象(字符串)创建的counter

    >>> c

    Counter({'a': 3, 'l': 2, 'd': 1, 'h': 1, 'g': 1})

    >>> c = Counter([2, 3, 4, 3, 3, 4]) # 通过可迭代对象(List)创建的counter

    >>> c

    Counter({3: 3, 4: 2, 2: 1})

     

    >>> c = Counter({'red':4, 'blue':2}) # 通过mapping对象(字典)创建的counter

    >>> c

    Counter({'red': 4, 'blue': 2})

     

    >>> c = Counter(cats=4, dogs=8) # 通过关键字参数创建的counter

    >>> c

    Counter({'dogs': 8, 'cats': 4})

     

    Counter对象拥有字典的接口,可通过字典方式,如counter[element]获取element的统计次数,如果keyelement不存在,则返回0

    >>> c = Counter(['eegs', 'ham'])

    >>> c

    Counter({'ham': 1, 'eegs': 1})

    >>> c['bacon']

    0

     

     

    修改某个元素的统计次数,然后使用del移除该元素的统计

    >>> c = Counter(['shouke', 'shouke', '2017'])

    >>> c

    Counter({'shouke': 2, '2017': 1})

    >>> c['shouke'] = 1

    >>> c

    Counter({'shouke': 1, '2017': 1})

     

    >>> del c['shouke']

    >>> c

    Counter({'2017': 1})

    3.1中新增

     

    对象方法

    除了支持字典对象所拥的方法之外,Counter对象还支持以下三种方法

    elements()

    返回一个List,如果存在被统计元素,且元素统计次数大于0,假设为N,则该元素会在list中重复出现N次。List中元素未知顺序任意。

     

    >>> c = Counter(a=4, b=2, c=0, d=-2)

    >>> c.elements()

    >>> list(c.elements())

    ['b', 'b', 'a', 'a', 'a', 'a']

     

    注意:统计次数小于0的元素被忽略了。

     

     

    most_common([n])

    返回元素统计次数排名前N位的元素,如果不指定N,默认返回全部元素的统计。如果元素彼此的统计次数相等,则元素的顺序任意。

    >>> Counter('abracadabra').most_common(3)

    [('a', 5), ('b', 2), ('r', 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})

     

    >>> d = Counter(a=1, b=2, c=3, d=4, e=2)

    >>> c.subtract(d)

    >>> c

    Counter({'a': 2, 'b': -2, 'e': -2, 'c': -6, 'd': -10})

    说明:如上,如果后一个counter中的元素在前一个counter中未出现,则默认前一个counter中该元素的统计次数为0

    3.2中新增

    以下两个常规的字典方法,对于Counter对象,有点不一样

    fromkeys(iterable)

    该方法对于counter对象来说,未实现。

     

    update([iterable-or-mapping])

    根据提供的可迭代对象,或者映射对象,或者counter更新统计次数。可迭代对象,期望是元素序列,而(key,value)非键值对序列

    >>> c = Counter(a=4, b=2, c=0, d=-2)

    >>> c.update(['d', 'd', 'a', 'c', 'e'])

    >>> c

    Counter({'a': 5, 'b': 2, 'c': 1, 'e': 1, 'd': 0})

     

    Counter对象常见使用模式

    >>> c

    Counter({'a': 5, 'b': 2, 'c': 1, 'e': 1, 'd': 0})

    >>> sum(c.values())  # 获取元素统计次数之和

    9

    >>> c.clear() # 清空统计

    >>> c

    Counter()

     

    >>> c = Counter(['shou', 'ke', '2014', '2017', '2017'])

    >>> c

    Counter({'2017': 2, '2014': 1, 'ke': 1, 'shou': 1})

     

    >>> list(c)  # 返回元素的list表示,元素唯一,不改变Counter对象

    ['2017', '2014', 'ke', 'shou']

     

    >>> set(c)  # 返回元素的set集合,不改变Counter对象

    {'2017', '2014', 'ke', 'shou'}

     

    >>> dict(c)  # 返回包含elem:cnt(元素:统计次数)对的字典,不改变Counter对象

    {'2017': 2, '2014': 1, 'ke': 1, 'shou': 1}

     

    >>> c.items() # 所有统计项

    dict_items([('2017', 2), ('2014', 1), ('ke', 1), ('shou', 1)])

     

    # Counter(dict([(elem,cnt),(elem,cnt)])) # 从包含(elem,cnt)对的list创建counter对象

    >>> Counter(dict([('shou',2),('ke',1)]))

    Counter({'shou': 2, 'ke': 1})

     

    # c.most_common()[:-n:-1],返回统计次数最少的前 n-1

    >>> c.most_common()[:-3:-1]

    [('shou', 1), ('ke', 1)]

     

    >>> c = Counter(dict([('shou', 1), ('ke',2), ('2014', 0),('2017',-1)]))

    >>> +c  # 返回移除了统计值为0、负数的统计项后的Counter

    Counter({'ke': 2, 'shou': 1})

    >>> c

    Counter({'ke': 2, 'shou': 1, '2014': 0, '2017': -1})

    >>>

     

     

    数学运行

    输出只会保留统计大于0的统计项

    >>> c = Counter(a=3, b=1)

    >>> d = Counter(a=1, b=2)

    >>> c + d  # c[x] + d[x]

    Counter({'a': 4, 'b': 3})

     

    >>> c -d   #  c[x] - d[x]

    Counter({'a': 2})  #忽略了统计值为0的项

     

    >>> c & d  # min(c[x], d[x])

    Counter({'b': 1, 'a': 1})

     

    >>> c | d  # max(c[x], d[x])

    Counter({'a': 3, 'b': 2})

     

     

    添加空的Counter、用空的counter减去当前Counter的简写方法

    >>> c = Counter(a=2, b=-4)

    >>> +c

    Counter({'a': 2})

    >>> -c

    Counter({'b': 4})

    >>>

    3.3新增

    New in version 3.3: Added support for unary plus, unary minus, and in-place multiset operations

     

    应用举例

    类似如下的一个列表,数据总量达100w,要提取其中重复的数据。

    解决方案:逐行读取,把读取的数据保存在list中,然后如下,构造Counter对象,然后判断Counter对象中,元素统计值是否大于1,大于1则表明存在重复数据,print,(实践测试,实际处理耗时: 1s

    # 获取重复数据
    c = Counter(list_data)
    for item in c.items():
        if item[1] > 1:
            print('重复数据:%s' % item[0])

     

    查看更多类型介绍,烦参考官方文档

  • 相关阅读:
    理解-NumPy
    python % format
    计算机三级网络技术考过指南
    jquery 增加与删除数组元素
    jquery 改变标签可见状态的几种方式
    pL/SQL 创建DBLIKN
    Oracle 数据类型详解
    状态模式例子---流程控制
    jqGrid 将行的字变成超连接
    表单提交详细介绍
  • 原文地址:https://www.cnblogs.com/shouke/p/10157605.html
Copyright © 2011-2022 走看看