Python3 collections模块

目录

1、collections的常用类型

2、Counter

3、deque

4、defaultdict

5、OrderedDict 

6、namedtuple


1、collections的常用类型

  • 计数器(Counter)
  • 双向队列(deque)
  • 默认字典(defaultdict)
  • 有序字典(OrderedDict)
  • 可命名元组(namedtuple)

使用以上类型时需要导入模块 from collections import *

collections是Python内建的一个集合模块,提供了许多有用的集合类

2、Counter

Counter 作为字典(dict)的一个子类用来进行hashtable计数,将元素进行数量统计、计数后返回一个字典,键值为元素:值为元素个数

[python] view plain copy

  1. s = 'abcbcaccbbad'  
  2. l = ['a','b','c','c','a','b','b']  
  3. d = {'2': 3, '3': 2, '17': 2}  
  4. # Counter 获取各元素的个数,返回字典  
  5. print(Counter(s))   # Counter({'c': 4, 'b': 4, 'a': 3})  
  6. print(Counter(l))   # Counter({'b': 3, 'a': 2, 'c': 2})  
  7. print(Counter(d))   # Counter({3: 3, 2: 2, 17: 1})  

[python] view plain copy

  1. # most_common(int) 按照元素出现的次数进行从高到低的排序,返回前int个元素的字典  
  2. m1 = Counter(s)  
  3. print(m1)                 # Counter({'c': 4, 'b': 4, 'a': 3, 'd': 1})  
  4. print(m1.most_common(3))  # [('c', 4), ('b', 4), ('a', 3)]  

[python] view plain copy

  1. # elements 返回经过计数器Counter后的元素,返回的是一个迭代器  
  2. e1 = Counter(s)  
  3. print(''.join(sorted(e1.elements())))  # aaabbbbcccc  
  4. e2 = Counter(d)  
  5. print(sorted(e2.elements()))  # ['17', '17', '2', '2', '2', '3', '3'] 字典返回value个key  

[python] view plain copy

  1. # update 和set集合的update一样,对集合进行并集更新  
  2. u1 = Counter(s)  
  3. u1.update('123a')  
  4. print(u1)  # Counter({'a': 4, 'c': 4, 'b': 4, '1': 1, '3': 1, '2': 1})  

[python] view plain copy

  1. # substract 和update类似,只是update是做加法,substract做减法,从另一个集合中减去本集合的元素,  
  2. sub1 = 'which'  
  3. sub2 = 'whatw'  
  4. subset = Counter(sub1)  
  5. print(subset)   # Counter({'h': 2, 'i': 1, 'c': 1, 'w': 1})  
  6. subset.subtract(Counter(sub2))  
  7. print(subset)   # Counter({'c': 1, 'i': 1, 'h': 1, 'a': -1, 't': -1, 'w': -1}) sub1中的h变为2,sub2中h为1,减完以后为1  

iteritems  与字典dict的items类似,返回由Counter生成的字典的所有item,只是在Counter中此方法返回的是一个迭代器,而不是列表

iterkeys  与字典dict的keys方法类似,返回由Counter生成的字典的所有key,只是在Counter中此方法返回的是一个迭代器,而不是列表

itervalues  与字典dict的values方法类似,返回由Counter生成的字典的所有value,只是在Counter中此方法返回的是一个迭代器,而不是列表

3、deque

deque 包含在文件_collections.py中,属于高性能的数据结构(High performance data structures)之一.可以从两端添加和删除元素,常用的结构是它的简化版

deque常用方法:

deque

[python] view plain copy

  1. str1 = 'abc123cd'  
  2. dq = deque(str1)  
  3. print(dq)        # deque(['a', 'b', 'c', '1', '2', '3', 'c', 'd'])  

append

队列右边添加元素

appendleft

队列左边添加元素

[python] view plain copy

  1. dq = deque('abc123')  
  2. dq.append('right')  
  3. dq.appendleft('left')  
  4. print(dq) # deque(['left', 'a', 'b', 'c', '1', '2', '3', 'right'])  
  • clear  clear 清空队列中的所有元素
  • count  count(value)  返回队列中包含value的个数,结果类型为 integer
  • extend  extend 队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque
  • extendleft  extendleft  同extend, 在左边扩展

[python] view plain copy

  1. dq = deque('abc123')  
  2. dq.extend({1:10,2:20})  
  3. dq.extendleft('L')  
  4. print(dq) # deque(['L', 'a', 'b', 'c', '1', '2', '3', 1, 2])  
  • pop  pop  移除并且返回队列右边的元素
  • popleft  popleft 移除并且返回队列左边的元素
  • remove  remove(value) 移除队列第一个出现的元素(从左往右开始的第一次出现的元素value)
  • reverse  reverse  队列的所有元素进行反转
  • rotate  rotate(n) 对队列的数进行移动,若n<0,则往左移动即将左边的第一个移动到最后,移动n次,n>0 往右移动

[python] view plain copy

  1. dq = deque([1,2,3,4,5])  
  2. dq.rotate(-1) # 左移,1往左移动一位到5后面  
  3. print(dq)  

4、defaultdict

默认字典,是字典的一个子类,继承有字典的方法和属性,默认字典在进行定义初始化的时候可以指定字典值得默认类型:

[python] view plain copy

  1. dic = collections.defaultdict(dict)  
  2. dic['k1'].update({'k2':'aaa'})  
  3. print(dic)  

我们看上面的例子,字典dic在定义的时候就定义好了值为字典类型,虽然现在字典中还没有键值 k1,但仍然可以执行字典的update方法. 这种操作方式在传统的字典类型中是无法实现的,必须赋值以后才能进行值得更新操作,否则会报错。
我看看一下传统的字典类型

[python] view plain copy

  1. b = dict()  
  2. b['k1'].append('2')  
  3. # TypeError: 'type' object is not iterable  

5、OrderedDict 

OrderDict 叫做有序字典,也是字典类型(dict)的一个子类,是对字典的一个补充。 前面我们说过,字典类型是一个无序的集合,如果要想将一个传统的字典类型进行排序一般会怎么做了,我们可能会将字典的键值取出来做排序后在根据键值来进行有序的输出,我们看下面的一个例子:

[python] view plain copy

  1. # 定义传统字典  
  2. dic1 = dict()  
  3. # 按顺序添加字典内容  
  4. dic1['a'] = '123'  
  5. dic1['b'] = 'jjj'  
  6. dic1['c'] = '394'  
  7. dic1['d'] = '999'  
  8. print(dic1)    # 结果: {'a': '123', 'c': '394', 'b': 'jjj', 'd': '999'}  
  9. # 排序  
  10. dic1_key_list = []  
  11. for k in dic1.keys():  
  12.     dic1_key_list.append(k)  
  13. dic1_key_list.sort()  
  14. for key in dic1_key_list:  
  15.     print('dic1字典排序结果 %s:%s' %(key,dic1[key]))  

以上为定义传统字典类型时的一个简单排序过程。 如果我们定义一个有序字典时,将不用再如此麻烦, 字典顺序将按照录入顺序进行排序且不会改变。

[python] view plain copy

  1. # 定义有序字典  
  2. dic2 = OrderedDict()  
  3. dic2['a'] = '123'  
  4. dic2['b'] = 'jjj'  
  5. dic2['c'] = 'abc'  
  6. dic2['d'] = '999'  
  7. for k, v in dic2.iteritems():  
  8.     print('有序字典:%s:%s' %(k,v))  

6、namedtuple

标准的tuple类型使用数字索引来访问元素,

[python] view plain copy

  1. bob = ('Bob', 30, 'male')  
  2. print('Representation:', bob)  
  3.   
  4. jane = ('Jane', 29, 'female')  
  5. print('\nField by index:', jane[0])  
  6.   
  7. print('\nFields by index:')  
  8. for p in [bob, jane]:  
  9.     print('%s is a %d year old %s' % p)  

这种对于标准的元组访问,我们需要知道元素对应下标索引值,但当元组的元素很多时,我们可能无法知道每个元素的具体索引值,这个时候就是可命名元组登场的时候了。

nametuple 的创建是由自己的类工厂nametuple()进行创建,而不是由标准的元组来进行实例化,通过nametuple()创建类的参数包括类名称和一个包含元素名称的字符串

[python] view plain copy

  1. from collections import namedtuple  
  2.   
  3. #创建一个nametuplede 类,类名称为Person,并赋给变量P  
  4. P = namedtuple('Person''name,age,gender')  
  5. print('Type of Person:', type(P))  # Type of Person: <class 'type'>  
  6.   
  7. #通过Person类实例化一个对象bob  
  8. bob = P(name='Bob', age=30, gender='male')  
  9. print('\nRepresentation:', bob)  # Representation: Person(name='Bob', age=30, gender='male')  
  10.   
  11. #通过Person类实例化一个对象jane  
  12. jane = P(name='Jane', age=29, gender='female')  
  13. print('\nField by name:', jane.name)  # Field by name: Jane  
  14.   
  15. print('\nFields by index:')  
  16. for p in [bob, jane]:  
  17.     print('%s is a %d year old %s' % p)  
  18. # Fields by index:  
  19. # Bob is a 30 year old male  
  20. # Jane is a 29 year old female  

通过上面的实例可以看出,我们通过nametuple()创建了一个Person的类,并复制给P变量,Person的类成员包括name,age,gender,并且顺序已经定了,在实例化zhangsan这个对象的时候,对张三的属性进行了定义。这样我们在访问zhangsan这个元组的时候就可以通过张三的属性来复制(zhangsan.name、zhangsan.age等)。这样就算这个元组有1000个元素我们都能通过元素的名称来访问而不用考虑元素的下标索引值。

非法的参数值

使用nametuple()来创建类的时候,传递的成员属性参数名称不能非法(不能为系统参数名称),且参数名称不能重复,否则会报值错误

[python] view plain copy

  1. # 参数字段的名称非法,包含系统名称class  
  2. try:  
  3.     p = namedtuple('Person','age,name,class,gender')  
  4.     print(p._fields)  
  5. except ValueError as err:  
  6.     print(err)  
  7.   
  8. # Type names and field names cannot be a keyword: 'class'  
  9.   
  10. # 类成员字段参数名称重复 age  
  11. try:  
  12.     p1 = namedtuple('Person','age,gender,name,age')  
  13.     print(p1._fields)  
  14. except ValueError as err:  
  15.     print(err)  
  16. # Encountered duplicate field name: 'age'  

但是也有时候我们是无法控制的,如果参数的名称来自外部,比如是通过读取数据库中的内容来传递的参数,此时我们无法手工的修改参数名称,那该如何是好呢! 别担心,只需要增加一个属性就OK了,它就是rename

[python] view plain copy

  1. # 参数字段的名称非法,包含系统名称class  
  2. try:  
  3.     p = namedtuple('Person','age,name,class,gender',rename=True)  
  4.     print(p._fields)  
  5. except ValueError as err:  
  6.     print(err)  
  7.   
  8. # ('age', 'name', '_2', 'gender')  
  9.   
  10. # 类成员字段参数名称重复 age  
  11. try:  
  12.     p1 = namedtuple('Person','age,gender,name,age',rename=True)  
  13.     print(p1._fields)  
  14. except ValueError as err:  
  15.     print(err)  
  16. # ('age', 'gender', 'name', '_3')  

从以上的实例我们看出,当有参数错误的时候,系统自动将错误的参数通过增加 "下划线+参数索引" 的方式自动将参数名称替换了。

转载博客

### 回答1: collections模块是Python标准库中的一个模块,提供了许多有用的数据类型。其中包括: - deque: 双端队列 - Counter: 计数器 - OrderedDict: 有序字典 - defaultdict: 默认字典 - namedtuple: 命名元组 - ChainMap: 链接多个字典 使用这些类型可以更方便地进行数据操作和处理。 ### 回答2: collections是Python标准库中的一个模块,提供了许多有用的容器数据类型。这些数据类型是基于内置的数据类型(如字典,列表和集合等)的实现,以提供更多的功能和灵活性。 collections模块中最常用的数据类型是:Counter、defaultdict、OrderedDict和namedtuple。 Counter是一个字典的子类,用于计算可哈希对象的出现次数。它可以接受任何可哈希对象的序列作为输入,并返回一个字典,其中包含每个对象作为键和其出现次数作为值。 defaultdict是一个字典的子类,它可以接受一个工厂函数作为参数。当访问不存在的键时,默认会返回该工厂函数的返回值,而不是抛出KeyError异常。这对于处理缺失键的情况非常有用。 OrderedDict是一个有序的字典,它以插入顺序来维护元素的顺序。与普通的字典不同,OrderedDict可以记住元素的添加顺序,从而实现按照插入顺序进行遍历。 namedtuple是一个工厂函数,用于创建具有命名字段的元组子类。它允许我们为元组中的每个字段指定一个名称,从而增加了元组的可读性和代码的可维护性。 除了上述常用的数据类型外,collections模块还提供了其他一些有用的类,如deque(双端队列)、ChainMap(合并多个字典)、UserDict(方便地创建字典的一种方式)等。 总而言之,collections模块扩展了Python内置的容器数据类型,提供了更多方便、灵活和高效的数据结构,使我们在处理数据时更加方便和高效。它是每个Python程序员都应该熟悉和掌握的重要模块之一。 ### 回答3: collections模块是Python标准库中的一个模块,提供了一些常用的数据类型和工具,用于扩展内置的数据类型,提供方便的数据结构和算法。 collections模块中最常用的数据类型是容器类型,包括:Counter、defaultdict、deque、OrderedDict和namedtuple。 1. Counter:用于计数元素出现的次数,并以字典的形式返回计数结果。它可以用于快速计数列表、字符串或任何可迭代对象中的元素。 2. defaultdict:是内置字典类(dict)的一个子类,它通过传入一个默认值工厂函数,当键不存在时返回该默认值。这对于需要设置默认值的字典非常有用。 3. deque:双端队列,可以快速在两端进行插入和删除操作,比内置的list类型更高效。 4. OrderedDict:有序字典,它会根据元素的插入顺序保持顺序,与普通字典不同,遍历时返回的键值对按照插入顺序排列。 5. namedtuple:命名元组,是一个生成类的工厂函数,用于创建具有字段名称的元组。它可以通过字段名称访问元组的元素,提高了程序的可读性。 除了这些常用的数据类型,collections模块还提供了一些其他的工具函数,用于处理迭代器、排序和计数等操作。 总之,collections模块为Python开发者提供了一些有用的数据类型和工具,可以简化常见的数据操作,提高开发效率。无论是在处理复杂数据结构还是简单计数,使用collections模块可以更方便地进行操作和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asia-Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值