Python3 collections模块

本文详细介绍了 Python 中 collections 模块的六大核心组件:Counter、deque、defaultdict、OrderedDict 和 namedtuple 的用法及特点。并通过具体示例展示了如何高效地使用这些组件。

目录

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')  

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

转载博客

<think>好的,我现在要处理用户关于Pythoncollections模块的使用方法和功能的询问。首先,我需要回忆一下collections模块的主要组件和它们的作用。用户可能已经看过一些文档,但需要更清晰的解释和实际例子。 首先,用户提供的引用内容提到了collections模块中的几个数据结构,比如defaultdict、deque、Counter、OrderedDict等。我需要确保覆盖这些主要的类,并解释它们的用途和基本用法。 接下来,我需要检查是否有遗漏的重要数据结构。例如,namedtuple和ChainMap也是collections模块的一部分,应该在回答中提及。每个数据结构都需要一个简明的解释,可能的话,配上代码示例,这样用户更容易理解。 然后,考虑用户可能的疑问点。例如,defaultdict和普通dict的区别是什么?为什么使用deque而不是列表?这些点需要在介绍每个类的时候简要说明,突出它们的优势和适用场景。 另外,用户提供的引用中提到了性能优化,比如deque的高效插入和删除。这需要强调,特别是在处理队列和栈时的应用,对比列表操作的性能差异。 还需要注意代码示例的正确性。例如,在展示defaultdict时,确保导入正确,并且示例能清楚展示默认值的行为。同样,Counter的例子应该展示计数功能,如统计元素出现次数。 另外,用户可能对应用场景感兴趣,所以每个数据结构的典型使用场景需要简要说明。例如,Counter可以用于统计词频,deque适用于多线程任务队列等。 最后,生成的相关问题需要覆盖常见疑问,比如模块的其他功能、性能对比、实际应用案例等,这样可以引导用户进一步探索。 现在,我需要组织这些内容,确保结构清晰,分点介绍每个数据结构,每个部分包括功能、示例和优势。同时,保持语言简洁,避免技术术语过多,让初学者也能理解。 可能还需要检查是否有最新的Python版本中的变化,但根据引用内容,似乎都是基于标准库的现有功能,所以不需要考虑过时的信息。 总结一下,回答的结构应该是先概述collections模块,然后逐个介绍重要的类,每个类包含功能描述、代码示例和适用场景,最后生成相关问题供用户进一步学习。</think>### Python collections模块功能详解 Python的$collections$模块提供多种扩展数据结构,可显著提升开发效率。以下是核心组件及使用示例: --- #### 一、defaultdict:带默认值的字典 **功能**:自动为不存在的键生成默认值,避免$KeyError$。 ```python from collections import defaultdict word_count = defaultdict(int) words = ["apple", "banana", "apple"] for word in words: word_count[word] += 1 # 不存在时默认返回0 print(word_count) # defaultdict(<class &#39;int&#39;>, {&#39;apple&#39;: 2, &#39;banana&#39;: 1}) ``` **优势**:简化统计类代码逻辑[^3]。 --- #### 二、deque:双端队列 **功能**:支持高效头尾插入/删除($O(1)$时间复杂度)。 ```python from collections import deque queue = deque([1,2,3]) queue.appendleft(0) # 前端插入 queue.pop() # 后端删除 print(queue) # deque([0, 1, 2]) ``` **应用场景**:线程安全队列、滑动窗口算法[^1]。 --- #### 三、Counter:元素计数器 **功能**:快速统计可哈希对象的元素频率。 ```python from collections import Counter data = ["a", "b", "a", "c", "b", "a"] count = Counter(data) print(count.most_common(2)) # [(&#39;a&#39;, 3), (&#39;b&#39;, 2)] ``` **特点**:提供$most_common(n)$直接获取高频元素[^2]。 --- #### 四、OrderedDict:有序字典 **功能**:记录键的插入顺序(Python 3.7+普通dict已支持,但需显式保证顺序时仍有用)。 ```python from collections import OrderedDict od = OrderedDict() od["z"] = 3 od["a"] = 1 print(list(od.keys())) # [&#39;z&#39;, &#39;a&#39;] ``` --- #### 五、namedtuple:命名元组 **功能**:创建具有字段名的元组类。 ```python from collections import namedtuple Point = namedtuple("Point", ["x", "y"]) p = Point(10, y=20) print(p.x, p.y) # 10 20 ``` **优势**:增强代码可读性,替代简单类。 --- #### 六、ChainMap:多字典链式查找 **功能**:将多个字典逻辑合并,按顺序查找键。 ```python from collections import ChainMap dict1 = {"a": 1, "b": 2} dict2 = {"b": 3, "c": 4} chain = ChainMap(dict1, dict2) print(chain["b"]) # 返回dict1中的2 print(chain["c"]) # 返回dict2中的4 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

探模之翼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值