当前位置: 首页 > news >正文

Python——扩展数据类型

Python 的扩展数据类型是对内置数据类型的增强,旨在解决特定需求,提供更高级的功能。我们来看一些常见的扩展数据类型及其原理、用途,并通过示例逐步讲解。

1. collections.namedtuple

namedtuple 是增强的元组,允许用名称访问元素,增加代码可读性。

原理:它扩展了普通元组,通过名称而不是索引来访问元素。内部实际上还是使用元组存储数据,但通过动态生成类的方式增加了属性名。

场景:适合用于结构化数据存储,如数据库查询结果、坐标、RGB颜色值等。

示例

from collections import namedtuple# 定义一个名称为Point的 namedtuple
Point = namedtuple('Point', ['x', 'y'])p1 = Point(10, 20)
print(p1.x)  # 10
print(p1.y)  # 20

相比普通元组,它的可读性和易维护性都增强了:

p = (10, 20)  # 普通元组
print(p[0])   # 10, 使用索引访问,不直观

2. collections.defaultdict

defaultdict 是字典的扩展,可以指定一个默认工厂函数,当访问不存在的键时,会自动生成值。

原理:通过 __missing__() 方法处理缺失的键,调用默认工厂函数生成值。默认工厂函数可以是 intlist 等。

场景:适用于需要频繁初始化新键的场景,如统计、聚合等。

示例

from collections import defaultdict# 默认工厂函数为 list,初始化新键时返回空列表
dd = defaultdict(list)
dd['fruits'].append('apple')
print(dd)  # {'fruits': ['apple']}

如果使用普通字典会抛出 KeyError:

d = {}
# d['fruits'].append('apple')  # 抛出KeyError

3. collections.Counter

Counter 是用于计数的字典子类,适合用于频率统计。

原理:内部通过字典实现键值对,值表示元素出现的次数。

场景:适合统计元素频次,如统计单词、字符、事件等。

示例

from collections import Counterwords = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
word_count = Counter(words)
print(word_count)  # Counter({'apple': 3, 'banana': 2, 'orange': 1})

你可以直接用 Counter 对字符串进行统计:

text = "hello world"
char_count = Counter(text)
print(char_count)  # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

4. collections.deque

deque 是双向队列,支持从两端高效插入和删除。

原理:内部使用双向链表实现,比普通列表 list 在两端插入删除更快。

场景:适用于队列、栈等需要快速操作两端的场景。

示例

from collections import dequedq = deque([1, 2, 3])
dq.append(4)  # 在右边添加
dq.appendleft(0)  # 在左边添加
print(dq)  # deque([0, 1, 2, 3, 4])

list 比较:

lst = [1, 2, 3]
lst.insert(0, 0)  # 左边插入操作效率较低,deque 更优

5. collections.OrderedDict

OrderedDict 是保留插入顺序的字典子类。

原理:普通字典在 Python 3.7+ 版本中已经默认保持插入顺序,但 OrderedDict 在老版本中也提供了这种功能,并增加了 move_to_end 等方法。

场景:需要保证键值对插入顺序的场景,如处理 LRU 缓存等。

示例

from collections import OrderedDictod = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

6. collections.ChainMap

ChainMap 用于将多个字典组合成一个视图。

原理:它不会复制字典,而是动态构建一个视图,从多个字典中查找键。

场景:适用于需要在多个上下文(如局部和全局)中查找变量的场景。

示例

from collections import ChainMapdict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain = ChainMap(dict1, dict2)
print(chain['b'])  # 2, 优先返回第一个字典中的值

7. enum.Enum

Enum 是枚举类型,允许定义一组常量,并使用名称来引用它们。

原理:枚举类通过 enum 模块实现,赋予一组有意义的常量名称,增强代码的可读性。

场景:适合定义一组固定的常量值,如颜色、状态、方向等。

示例

from enum import Enumclass Color(Enum):RED = 1GREEN = 2BLUE = 3print(Color.RED)  # Color.RED
print(Color.RED.value)  # 1

总结

数据类型原理适用场景示例
namedtuple具名元组,使用名称访问结构化数据存储Point = namedtuple('Point', ['x', 'y'])
defaultdict自动初始化键值需要初始化键的字典操作dd = defaultdict(list)
Counter计数器统计频次word_count = Counter(words)
deque双向队列,快速插入删除栈、队列实现dq = deque([1, 2, 3])
OrderedDict保留插入顺序的字典LRU 缓存实现od = OrderedDict()
ChainMap多个字典的视图变量上下文查找chain = ChainMap(dict1, dict2)
Enum枚举类型,定义常量常量定义,如颜色、状态等Color.RED

这些扩展类型在处理特定问题时极为有用,它们可以提高代码的可读性、效率,并减少出错的可能。每个类型都为特定场景提供了优化方案,使代码更具表现力和清晰度。


http://www.mrgr.cn/news/1746.html

相关文章:

  • wordpress视频模板
  • Redis RDB三两事
  • Redis在Linux的安装
  • Springboot集成Kafka
  • 最近在写的支付模块
  • 汽车IVI中控OS Linux driver开发实操(二十二):kernal的异步作业
  • 防火墙技术原理与应用
  • 代码随想录算法训练营_day20
  • 2.1 文件内容差异对比方法
  • 初探 SinoDB 星瑞格数据库
  • 【存储学习笔记】4:快照(Snapshot)技术的实现方式
  • 初识指针4の学习笔记
  • Java中的安全编程实践:加密、解密与数字签名
  • 结构型模式之适配器模式
  • 基础 - 前端知识体系详解
  • 我的Vue2/Vue3知识框架汇总
  • 【爬虫开发】爬虫开发从0到1全知识教程第2篇:requests模块,知识点:【附代码文档】
  • 集师知识付费小程序搭建。。。
  • 安卓小米便签工程结构分析
  • 【C语言】字符函数与字符串函数(上)