Python中 collections模块的详细用法介绍

1. 介绍

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

可以把它理解为一个容器,里面提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。

import collections

print(dir(collections))
# ['ChainMap', 'Counter', 'Mapping', 'MutableMapping', 'OrderedDict', 'UserDict', 'UserList', 'UserString', '_Link', '_OrderedDictItemsView', '_OrderedDictKeysView', '_OrderedDictValuesView', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_chain', '_collections_abc', '_count_elements', '_eq', '_heapq', '_iskeyword', '_itemgetter', '_nt_itemgetters', '_proxy', '_recursive_repr', '_repeat', '_starmap', '_sys', 'abc', 'defaultdict', 'deque', 'namedtuple']

里面有许多方法,我们只介绍常用的方法。

2.常用方法

  • namedtuple() : 创建一个命名元组子类的工厂函数
  • deque :    高效增删改双向列表,类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
  • defaultdict : 当字典查询时,为key不存在提供一个默认值。
  • OrderedDict : 有序词典,就是记住了插入顺序
  • Counter : 计数功能
1. namedtuple() 命名元组

参数

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
  • typename :  命名的名字,返回一个新的元组子类,名为 typename
  • field_names : 可以是一个[‘x’, ‘y’]这样的序列,也可以是’x, y’或者’x y’
  • rename :   python3.1添加,如果 rename 为真, 无效域名会自动转换成位置名。比如 [‘abc’, ‘def’, ‘ghi’, ‘abc’] 转换成 [‘abc’, ‘_1’, ‘ghi’, ‘_3’] , 消除关键词 def 和重复域名 abc 。
  • defaults :  python3.7添加, defaults 可以为 None 或者是一个默认值的 iterable(可迭代对象)。如果一个默认值域必须跟其他没有默认值的域在一起出现, defaults 就应用到最右边的参数。比如如果域名 [‘x’, ‘y’, ‘z’] 和默认值 (1, 2) ,那么 x 就必须指定一个参数值 ,y 默认值 1 , z 默认值 2 。
  • module :   python3.6添加,如果 module 值有定义,命名元组的 __module__属性值就被设置。

使用

例如我想定义一个点(x, y),可以给它起个名字为Points

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import collections

point = collections.namedtuple('Points', ['x', 'y'])
p1 = point(2, 3)
p2 = point(4, 2)

print(p1) # Points(x=2, y=3)
print(p2) # Points(x=4, y=2)

用 isinstance 判断其类型

print(isinstance(p1, point)) # True
print(isinstance(p1, tuple)) # True

可以发现它即属于 point 类型,也属于 tuple 类型。

使用 _make 赋值

a= [11, 3]
p1._make(a)
print(p1) # Points(x=11, y=3)

使用 _replace 更改值

p1._replace(x=5)
print(p1) # Points(x=5, y=3)
2. deque 双端队列

参数

collections.deque([iterable[, maxlen]])

返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。

  • iterable :迭代对象,可以是字符串,列表等可迭代对象。
  • maxlen : maxlen 没有指定或者是 None , deque 可以增长到任意长度。否则, deque 就限定到指定最大长度。一旦限定长度的 deque 满了,当新项加入时,同样数量的项就从另一端弹出。

使用

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from collections import deque

q = deque(['a', 'b', 'c'], maxlen=10)
# 从右边添加一个元素
q.append('d')
print(q) # deque(['a', 'b', 'c', 'd'], maxlen=10)

# 从左边删除一个元素
print(q.popleft()) # a
print(q) # deque(['b', 'c', 'd'], maxlen=10)

# 扩展队列
q.extend(['i', 'j'])
print(q) # deque(['b', 'c', 'd', 'i', 'j'], maxlen=10)

# 查找下标
print(q.index('c')) # 1

# 移除第一个'd'
q.remove('d')
print(q) # deque(['b', 'c', 'i', 'j'], maxlen=10)

# 逆序
q.reverse()
print(q) # deque(['j', 'i', 'c', 'b'], maxlen=10)

# 最大长度
print(q.maxlen) # 10

全部方法

append(x):添加 x 到右端。

appendleft(x):添加 x 到左端。

clear():移除所有元素,使其长度为0.

copy():创建一份浅拷贝。3.5 新版功能.

count(x):计算deque中个数等于 x 的元素。3.2 新版功能.

extend(iterable):扩展deque的右侧,通过添加iterable参数中的元素。

extendleft(iterable):扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。

index(x[, start[, stop]]):返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 。3.5 新版功能.

insert(i, x):在位置 i 插入 x 。如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 。3.5 新版功能.

pop():移去并且返回一个元素,deque最右侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。

popleft():移去并且返回一个元素,deque最左侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。

remove(value):移去找到的第一个 value。 如果没有的话就升起 ValueError 。

reverse():将deque逆序排列。返回 None3.2 新版功能.

rotate(n=1):向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。

Deque对象同样提供了一个只读属性:
maxlen:Deque的最大尺寸,如果没有限定的话就是 None
3. defaultdict 默认值字典

使用

当key不存在时返回默认值

from collections import defaultdict
dd = defaultdict(lambda: 'not exist')
dd['key1'] = 'abc'
print(dd['key1']) # key1存在  
# 'abc'
print(dd['key2']) # key2不存在,返回默认值
# 'not exist'

使用 list 作为 default_factory ,很容易将序列作为键值对加入字典:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from collections import defaultdict

d = defaultdict(list)
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

for k, v in s:
    d[k].append(v)

print(d) # defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})

相当于

d = {}
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

for k, v in s:
    d.setdefault(k, []).append(v)

print(d) # {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}

设置 default_factory 为 int ,可以很好的用于计数

s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1

print(d) # defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})
4. OrderedDict 有序字典

有序词典就像常规词典一样,但有一些与排序操作相关的额外功能。

但是内置的 dict 类已经有了记住插入顺序的能力(在 Python 3.7 中保证了这种新行为),所以它变得不那么重要了。

使用

popitem(last=True) :有序字典的 popitem() 方法移除并返回一个 (key, value) 键值对。 如果 last 值为真,则按 LIFO 后进先出的顺序返回键值对,否则就按 FIFO 先进先出的顺序返回键值对。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from collections import OrderedDict

d = OrderedDict(a=1, b=2, c=3, d=4,e=5)
print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])
print(d.popitem(last=True)) # ('e', 5)
print(d.popitem(last=False)) # ('a', 1)
print(d) # OrderedDict([('b', 2), ('c', 3), ('d', 4)]

move_to_end(key, last=True):将现有 key 移动到有序字典的任一端。 如果 last 为真值(默认)则将元素移至末尾;如果 last 为假值则将元素移至开头。如果 key 不存在则会触发 KeyError。

from collections import OrderedDict


d = OrderedDict(a=1, b=2, c=3, d=4,e=5)
print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

d.move_to_end(key='c', last=True)
print(d) # OrderedDict([('a', 1), ('b', 2), ('d', 4), ('e', 5), ('c', 3)])

d.move_to_end(key='b', last=False)
print(d) # OrderedDict([('b', 2), ('a', 1), ('d', 4), ('e', 5), ('c', 3)])
5. Counter 计数

Counter 是一个 dict 的子类,用于计数可哈希对象。特别方便!

使用

字符串

from collections import Counter

c = Counter()
for i in 'sfsadfsdjklgsdla':
    c[i] +=  1

print(isinstance(c,Counter)) # True
print(isinstance(c,dict)) # True
print(c) # Counter({'s': 4, 'd': 3, 'f': 2, 'a': 2, 'l': 2, 'j': 1, 'k': 1, 'g': 1})

c2 = Counter('asfjslfjsdlfjgkls')
print(c2) # Counter({'s': 4, 'd': 3, 'f': 2, 'a': 2, 'l': 2, 'j': 1, 'k': 1, 'g': 1})

列表

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from collections import Counter

c = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(c) # Counter({'blue': 3, 'red': 2, 'green': 1})

elements() :返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一, elements() 将会忽略它。

c = Counter(a=4, b=2, c=0, d=-2)
print(sorted(c.elements())) # ['a', 'a', 'a', 'a', 'b', 'b']

most_common([n]) :返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序。 如果 n 被省略或为 None, most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序:

c = Counter('abracadabra')
print(c.most_common(3)) # [('a', 5), ('b', 2), ('r', 2)]

subtract([iterable-or-mapping]) :从 迭代对象 或 映射对象 减去元素。像 dict.update() 但是是减去,而不是替换。输入和输出都可以是0或者负数。

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
print(c) # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
<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 ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值