python-collections模块

本文深入介绍了Python标准库collections模块中的核心组件,包括计数器counter、有序字典OrderedDict、默认字典defaultdict、双向队列deque及可命名元组namedtuple的功能与使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

本篇主要介绍collections模块中的以下几样:

①计数器counter()

②有序字典OrderedDict()

③默认字典defaultdict()

④双向队列deque()

 

一、计数器counter()

counter 是一种特殊的字典,主要方便用来计数,它继承于dict类,因此具有dict类中所有的功能,此外,还具备了自己特有的功能

一小部分源码:

import collections
obj=collections.Counter('aabbddsafd')             #创建一个counter对象
print(obj)

-----结果-----
Counter({'a': 3, 'd': 3, 'b': 2, 's': 1, 'f': 1})

 

1.most_common()

统计出现次数最多的几个元素

import collections
obj=collections.Counter('aabbddsafd')
print(obj)
print(obj.most_common(4))                         #拿到前四位

-----结果------
[('a', 3), ('d', 3), ('b', 2), ('s', 1)]

 

2.更新update()

import collections
obj=collections.Counter('aaabb')
print(obj)
obj.update([11,22,'a'])
print(obj)

-----结果-----
Counter({'a': 3, 'b': 2})
Counter({'a': 4, 'b': 2, 11: 1, 22: 1})

 

3.删除元素subtract()

import collections
obj=collections.Counter('aaabb')
print(obj)
obj.subtract(['a','11'])
print(obj)

-----结果-----
Counter({'a': 3, 'b': 2})
Counter({'a': 2, 'b': 2, '11': -1})

注意:使用subtract()时,如果元素不够扣除,相应元素的个数会以负数的形式展示

 

4.获取元素elements() 

用counter()产生的对象,看上去像一个字典,其实并不是真实的字典,想要取其中的元素,得用elements()去获取

import collections
obj=collections.Counter('aabbddsafd')
for k in obj.elements():
    print(k)

-----结果-----
a
a
a
b
b
.
.

 

注意:如果想要取出其中key和values,得用dict类中的方法

import collections
obj=collections.Counter('aabbddsafd')
for k,v in obj.items():
    print(k,v)

-----结果-----
a 3
b 2
d 3
s 1
f 1

 

二、有序字典OrderedDict()

 创建一个有序字典:

import collections
dic=collections.OrderedDict()
dic['k1']='v1'
dic['k2']='v2'
dic['k3']='v3'
print(dic)

-----结果-----
OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])

 

1.移动到末尾move_to_end()

import collections
dic=collections.OrderedDict()
dic['k1']='v1'
dic['k2']='v2'
dic['k3']='v3'
dic.move_to_end('k1')
print(dic)

-----结果-----
OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])

 

2.删除pop()与popitem()

#pop()
import collections
dic=collections.OrderedDict()
dic['k1']='v1'
dic['k2']='v2'
dic['k3']='v3'
dic.pop('k1')
print(dic)
-----结果-----
OrderedDict([('k2', 'v2'), ('k3', 'v3')])



#popitem()     
import collections
dic=collections.OrderedDict()
dic['k1']='v1'
dic['k2']='v2'
dic['k3']='v3'
dic.popitem()             
print(dic)
-----结果-----
OrderedDict([('k1', 'v1'), ('k2', 'v2')])

对比结果可知,popitem()是去除最后一个元素,且其中不需要加入参数值,pop()是删除指定的元素,其中需要加入参数值,且删除的值可重新生成一个对象

 

3. 设定默认值

import collections
dic=collections.OrderedDict()
dic['k1']='v1'
dic['k2']='v2'
dic['k3']='v3'
dic.setdefault('k4')        #当不指定值的时候,默认为None,效果等同于dic['k4']=None
print(dic)

-----结果-----
OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', None)])

 

三、默认字典defaultdict()

作用:定义一个字典,让这个字典的值默认为某个类型

创建一个默认字典:

import collections
dic = collections.defaultdict(list)     #对字典里值设置为list类型
dic['k1'].append('test001')             #append是list类才有的方法,由于设了默认类型,才能用
print (dic)

-----结果-----
defaultdict(<class 'list'>, {'k1': ['test001']})

 

四、可命名元组nametuple()

通常的元组,如果想要访问里面的元素,是只能通过索引去访问,如t[0]。而在可命名元组中,则可以针对每个元素定义一个名字,通过名字去访问相应的名字

注意:在collections包中,可命名元组与其他不同的是:创建计数器、有序字典这些对象时,都是由相应的类产生的,但是,在该包中,没有"可命名元组"这个类,

         想要使用可命名元组,首先得创建一个类。通过nametuple()这个方法,去创建相应的类

import  collections
MytupleClass=collections.namedtuple('MytupleClass',['x','y','z'])    #创建类MytoupleClass
obj=MytoupleClass(11,22,33)                                          #通过类创建了对象,其中x=11,y=22,z=33
print(obj.x)
print(obj.y)
print(obj.z)

-----结果-----
11
22
33

其中,MytupleClass是创建的类,obj为该类创建的对象,想看查看该类下面有哪些功能,可以使用如下方法:

print(help(MytupleClass))

部分截图如下:

 

五、双向队列deque()

队列是类似于栈一样的一种数据结构

单向队列:先进先出,一端进,另一端出

双向队列:在一端可以进和出,在另一端也可进和出

 

1.添加元素

import collections
d=collections.deque()
d.append('a')                  #从右边添加
d.append('b')
d.appendleft(1)                #从左边添加
d.appendleft(2)
print(d)  
print(d.count('a'))            #用count()统计元素出现的个数
 
-----结果-----
deque([2, 1, 'a', 'b'])
1

 

2.扩展元素

import collections
d=collections.deque()
d.extend(['aa','bb'])          #从右侧扩展
d.extendleft([11,22])          #从左侧扩展
print(d)

-----结果-----
deque([22, 11, 'aa', 'bb'])

  

3.获取索引位置

import collections
d=collections.deque([1,2,3])
print(d.index(1))

-----结果-----
0

 

4.删除

import collections
d=collections.deque([1,2,3])
d.pop()                #从右侧删除
print(d)
d.popleft()            #从左侧删除
print(d) 

-----结果-----
deque([1, 2])
deque([2])

 

5.移动元素至首位

import collections
d=collections.deque([a,b,c])
d.rotate(1)          # 把最后一个元素放到首位
print(d)

-----结果-----
deque([c, a, b])

其余一些方法不一一介绍....

 

六、单向队列

单向队列不属于collections包中,而在queue包中

创建一个单向队列

import  queue
q=queue.deque()

单向队列的方法在此文中不做介绍 

转载于:https://www.cnblogs.com/nizhihong/p/6641306.html

<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 'int'>, {'apple': 2, 'banana': 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)) # [('a', 3), ('b', 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())) # ['z', 'a'] ``` --- #### 五、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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值