Python——扩展数据类型

server/2024/9/22 15:39:04/

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

1. collections.namedtuple

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

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

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

示例

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

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

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

2. collections.defaultdict

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

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

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

示例

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

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

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

3. collections.Counter

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

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

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

示例

python">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 对字符串进行统计:

python">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 在两端插入删除更快。

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

示例

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

list 比较:

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

5. collections.OrderedDict

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

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

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

示例

python">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 用于将多个字典组合成一个视图。

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

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

示例

python">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 模块实现,赋予一组有意义的常量名称,增强代码的可读性。

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

示例

python">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.ppmy.cn/server/101199.html

相关文章

产品经理-如何判断一个产品的好与坏(36)

当面试官问到,如何判断一个产品的好与坏时,该怎么回答,这个问题非常综合地考查了你对产品的理解,但是题目本身非常大且难有标准答案 即使是面试官也不敢说能答好这道题。求职者在遇到这种很开放的题目时,如果不假思索就开答,往往是很危险的。…

互联网摸鱼日报(2024-08-13)

互联网摸鱼日报(2024-08-13) 36氪新闻 氪星晚报 | 周鸿祎:大模型能帮助360从广告模式转向付费订阅模式;腾讯申请多枚脱口秀和TA的朋友们系列商标 2B多模态新SOTA,华科、华南理工发布Mini-Monkey,专治“切分增大分辨率”后遗症 …

企业大数据治理管理平台解决方案(33页PPT)

方案介绍: 本解决方案旨在为企业提供一套从数据采集、存储、处理、分析到应用的全链条大数据治理管理平台。该平台通过集成先进的数据技术和管理理念,帮助企业实现数据的全生命周期管理,提升数据质量,降低数据风险,促…

科技云报道:“大模型+机器人”,具身智能将开启“智械时代”

科技云报道原创。 从15世纪达芬奇绘制出世界上第一份人形机器人手稿,到如今波士顿动力、本田、特斯拉、Figure AI等企业相继推出了人形机器人产品,机器人新物种持续衍生,人形机器人产业已经从萌芽概念阶段进入产业化落地前期。 近日&#x…

如何获取 HTML 元素相对于浏览器窗口的位置?

大家好,今天我们来聊一聊前端开发中一个常见但又非常实用的小技巧:如何获取 HTML 元素相对于浏览器窗口的位置。不管你是新手还是有经验的开发者,这个技巧在处理布局调整、动画效果或滚动事件时都能派上大用场。接下来,我们一起来…

聚观早报 | 一加13配置细节曝光;谷歌首推人工智能手机

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 8月15日消息 一加13配置细节曝光 谷歌首推人工智能手机 MONA M03汽车即将上市 iPhone SE 4将升级8GB运行内存 R…

设计模式 之 —— 组合模式

目录 什么是组合模式? 定义 特点 结构 组合模式(java代码示例) 首先定义接口 定义叶节点(Leaf类) 定义容器节点(Composite类) 测试类: 树形图 运行结果: 组…

ssh免密登录下使用用scp命令复制本地主机文件到服务器仍然需要服务器密码怎么解决

在已经免密登录的情况下使用scp复制仍然需要服务器密码怎么解决? 由于在公司实习,在使用服务器的时候使用scp命令将本地文件复制到服务器上面发现需要服务器密码,不知道怎么解决。问了同组其他的人,她们都没有出现这种情况&#…