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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: python 标准类库-数据类型之集合-容器数据类型

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

 


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)
foriteminc.items():
   ifitem[1] >1:
       print('重复数据:%s'% item[0])

 

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

 

目录
相关文章
|
25天前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
62 1
思科设备巡检命令Python脚本大集合
|
2月前
|
存储 Java 容器
HashMap 的基本操作【集合容器知识回顾 ⑤】
本文介绍了HashMap的基本操作,包括创建对象、添加、获取、删除和替换元素、获取所有key的集合、遍历HashMap,以及如何存储自定义类型键值对,并强调了当使用自定义对象作为键时需要重写equals和hashCode方法以确保正确的行为。
HashMap 的基本操作【集合容器知识回顾 ⑤】
|
1月前
|
Python
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
本篇将详细介绍Python中的常见数据类型转换方法以及 `NoneType` 的概念。包括如何在整数、浮点数、字符串等不同数据类型之间进行转换,并展示如何使用 `None` 进行初始赋值和处理特殊情况。通过本篇的学习,用户将深入理解如何处理不同类型的数据,并能够在代码中灵活使用 `None` 处理未赋值状态。
55 2
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
|
1月前
|
编译器 数据安全/隐私保护 Python
Python--基本数据类型
【10月更文挑战第4天】
|
1月前
|
存储 缓存 API
解密 Python 集合的实现原理
解密 Python 集合的实现原理
38 11
|
1月前
|
存储 Python
python数据类型、debug工具(一)
python数据类型、debug工具(一)
|
1月前
|
存储 自然语言处理 数据处理
使用Python计算多个集合的交集详解
使用Python计算多个集合的交集详解
38 1
|
1月前
|
Python
[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
本文回顾了Python中`ord()`和`chr()`函数的使用方法,强调了这两个函数互为逆运算:`ord()`通过字符找到对应的序号,`chr()`则通过序号找到对应的字符。文章详细解释了函数参数类型的重要性,即`ord()`需要字符串类型参数,而`chr()`需要整数类型参数。若参数类型错误,则会引发`TypeError`。此外,还介绍了如何使用`type()`函数查询参数类型,并通过示例展示了如何正确使用`ord()`和`chr()`进行转换。最后,强调了在函数调用时正确传递参数类型的重要性。
21 3
|
2月前
|
存储 API 索引
Python 的集合是怎么实现的?
Python 的集合是怎么实现的?
48 9
|
2月前
|
存储 Java C++
30天拿下Python之数据类型
30天拿下Python之数据类型
36 4