命名元组(python)
命名元组与元组的差异,命名元组和字典,哪个效率更高。
(笔记模板由python脚本于2024年02月26日 12:31:36创建,本篇笔记适合熟悉python元组和字典的coder翻阅)
【学习的细节是欢悦的历程】
-
Python 官网: python 前沿。可惜是英文原版。所以,我要练习英文阅读。🧐🧐">https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
命名元组与元组的差异 命 名 元 组 (命名元组和字典,哪个效率更高)本文质量分:
【 97 97 97 】本文地址: https://blog.csdn.net/m0_57158496/article/details/136296389
CSDN质量分查询入口:http://www.csdn.net/qc
目 录- ◆ 命名元组
- 1、何时适宜使用命名元组?
- 2、元组和命名元组的异同?
- 3、命名元组比字典效率更高
- 3.1 命名元组相对于字典的优势
- 3.2 字典相对于命名元组的优势
- 4、创建命名元组
- 4.2 由已有字典 d i c t dict dict数据创建
- 4.3 由已有普通元组数据创建
- 5、元组真的不可改变?
◆ 命名元组
1、何时适宜使用命名元组?
- 命名元组在以下情况下特别有用:
1 1 1、数据的属性确定且固定
当数据元素的属性在创建后就不会改变时,命名元组是一个比较合适的选择。相比之下,字典的键是可以改变的,因此不适合用于表示具有固定属性的数据。
2 2 2、代码可读性和可维护性要求高
命名元组具有明确的字段名,这使得代码更容易阅读和理解。与之相反,字典的键值对缺乏固定的结构,容易导致代码混乱和难以维护。
3 3 3、数据需要进行解构操作
命名元组可以像普通元组一样进行解构操作, 即将一个命名元组的字段分别赋值给变量。这在处理具有固定字段的数据时非常方便。而字典在解构时需要额外的操作。
4 4 4、性能优化考虑
由于命名元组是不可变的,它的访问速度比字典更快。这对于数据量较大或需要频繁访问的场景非常有利。
回页首2、元组和命名元组的异同?
元组( T u p l e Tuple Tuple)和命名元组( N a m e d T u p l e NamedTuple NamedTuple)都是 P y t h o n Python Python中常用的数据结构,它们有以下几个异同点:
- 相同点
1、不可变性:一旦创建,它们的元素不能被修改。
2、有序性:元素按照创建时的顺序存储,可以通过索引访问。
3、可迭代性:都可以使用for循环进行遍历。
- 不同点
1、访问方式:普通元组通过索引访问,例如 t[0] ;命名元组可以通过字段名访问,例如 t.name 。
2、可读性:命名元组由于其元素有名字,所以代码的可读性更好。
3、创建方式:普通元组直接使用小括号,例如 t = (1, 2, 3) ( t = 1, 2, 3
,这样直接给一个变量赋值一个序列,创建的也是普通元组);命名元组需要使用 collections.namedtuple() 函数来创建,例如 Point = namedtuple(‘Point’, [‘x’, ‘y’]) 。
4、性能:普通元组在性能上略优于命名元组,因为命名元组需要额外的字典来存储字段名。
5、功能:命名元组提供了 ._make() 和 ._asdict() 等方法,可以将序列或字典转换成命名元组,以及将命名元组转换成字典。
总之,如果需要一个简单的、不可变的序列,可以使用普通元组;如果需要一个具有更好可读性和功能的序列,可以使用命名元组。
回页目录3、命名元组比字典效率更高
命名元组( N a m e d T u p l e NamedTuple NamedTuple)和字典(Dictionary)是 P y t h o n Python Python中两种不同的数据结构,它们在性能和用途上有所区别。一般来说,命名元组在某些操作上可能比字典更高效,但这取决于具体的使用场景和操作。
3.1 命名元组相对于字典的优势
- ==================================
1 1 1. 访问速度:命名元组的元素访问速度通常比字典快,因为字典需要通过哈希表来查找键,而命名元组可以直接通过索引和字段名访问。
2 2 2. 内存占用:命名元组通常比字典占用更少的内存,因为它们不需要为每个字段存储一个哈希表项。
3 3 3. 不可变性:命名元组是不可变的,这意味着一旦创建,它们的值就不能改变。这种不可变性可以提供额外的安全性,并有助于防止错误。
3.2 字典相对于命名元组的优势
- ==================================
1 1 1. 灵活性:字典可以动态地添加、删除和修改键值对,而命名元组的字段在创建时就已经确定,不能动态修改。
2 2 2. 键的类型:字典的键可以是任何不可变类型,如字符串、数字或元组,而命名元组的字段名必须是有效的Python标识符。
总的来说,如果需要一个轻量级、快速的固定字段集合,并且不需要动态修改字段,命名元组是一个很好的选择。如果需要更灵活的键值对存储,能够动态修改,那么字典可能更合适。
在实际应用中,选择哪种数据结构应该基于具体的需求和性能考量。对于大多数应用来说,这种选择可能不会对性能产生显著影响,因此代码的可读性和维护性可能是更重要的考虑因素。
回页目录4、创建命名元组
命名元组( N a m e d T u p l e NamedTuple NamedTuple)是 P y t h o n Python Python中一个非常有用的内置数据类型,它属于 c o l l e c t i o n s collections collections模块。命名元组是一种工厂函数,用来创建一个带字段名的元组子类。简单来说,命名元组就是具有名称的元组,每个元素都可以通过一个唯一的名字来访问,而不只是通过位置索引。
使用命名元组的好处是代码可读性和可维护性更强,因为字段名提供了自解释性,使得代码更加直观。
### 4.1 直接创建
下面是命名元组的一些基本操作
1、导入 c o l l e c t i o n s collections collections模块
from collections import namedtuple
2、定义一个命名元组类型
Point = namedtuple('Point', ['x', 'y'])
这里Point是新创建的命名元组类型名,'Point'是这个类型的名字,['x', 'y']是字段名列表。
4、创建命名元组实例
p = Point(11, y=22) # 位置参数和关键字参数都可以用来初始化
5、访问字段值
print(p.x) # 输出 11 print(p.y) # 输出 22
6、作为字典使用
命名元组可以像字典一样使用,但它们是不可变的。
print(p._asdict()) # 将命名元组转换为字典
7、字段遍历
for coordinate in p: print(coordinate)
8、索引和切片
由于命名元组是元组的子类,所以你可以像使用普通元组一样使用索引和切片。
print(p[0]) # 输出 11
9、替换字段值
可以使用_replace()方法来创建一个新的命名元组,其中某些字段被替换了。
p2 = p._replace(x=33)
命名元组非常适合用于那些需要简单、不可变且具有明确字段名的数据结构。在处理数据库记录、配置文件设置或函数的多个返回值时,它们是非常有用的。
又如:
#!/sur/bin/nve python # coding: utf-8 import collections from collections import namedtuple Author = namedtuple('Author', ('name', 'sex')) # 创建一个Author类。 t = Author('梦幻精灵_cq', '男') # 实例一个Author类。 print(f"\n命名元组类{Author = }的实例命名元组{t = }的对象类型是:{type(t)}。") print(f"\n\n命名元组元素引用:\n\n1. 按命名元组字段:{t.name = },{t.sex = }\n\n2. 按普通元组索引下标:姓名:{t[0]},性别:{t[1]}")
- 上面这段代码运行效果截屏图片
用._replace方法将name字段替换成英文
t._replace(name='DreamElf_cq') # 替换实例中的name成英文。 print(f"\n\n把实例t中的name字段替换成中文:{t.name = }")
- 代码运行效果截屏图片
4.2 由已有字典 d i c t dict dict数据创建
命名元组的创建,除了直接创建,还可以用已有字典 d i c t dict dict数据创建。
python代码
#!/sur/bin/nve python # coding: utf-8 from collections import namedtuple person_dict = {'name': '张三', 'age': 30, 'city': '北京'} # 已有有字典。 Person = namedtuple('Person', person_dict.keys()) # 创建一个命名元组类型,使用字典的键作为字段名。 person = Person(**person_dict) # # 使用字典的值来创建一个命名元组实例。 # 现在可以像这样访问命名元组中的字段 print(person.name) # 输出: 张三 print(person.age) # 输出: 30 print(person.city) # 输出: 北京
4.3 由已有普通元组数据创建
命名元组的创建,还可以由已有普通元组创建。只是要提供字段序列生成命名元组实例,即准备好命名元组的“名”,再用 . n a m e d t u p l e .namedtuple .namedtuple方法完成命名元组的创建。见如下代码示例:
python代码
#!/sur/bin/nve python # coding: utf-8 from collections import namedtuple # 假设我们有一个普通元组 person_tuple = ('张三', 30, '北京') # 定义一个字段名列表 fields = ['name', 'age', 'city'] # 创建一个命名元组类型 Person = namedtuple('Person', fields) # 将普通元组转换为命名元组 person = Person(*person_tuple) # 现在可以像这样访问命名元组中的字段 print(person.name) # 输出: 张三 print(person.age) # 输出: 30 print(person.city) # 输出: 北京
回页目录5、元组真的不可改变?
是的,元组在 P y t h o n Python Python中是不可变的。这意味着一旦创建了元组,就不能对其进行修改,例如不能更改元组中的元素,不能添加或删除元素。任何尝试修改元组内容的操作都会导致 T y p e E r r o r TypeError TypeError。
例如:
my_tuple = (1, 2, 3) my_tuple[0] = 4 # 这会引发TypeError
然而,有一些情况可能会让人误以为元组是可变的。例如,如果一个元组包含可变对象(如列表),则可以修改这些可变对象的内容,但这并不违反元组本身的不可变性。元组中的元素引用是不可变的,但被引用的对象本身可以是可变的。
例如:
my_tuple = (1, [2, 3], 4) my_tuple[1][0] = 5 # 这是允许的,因为修改的是列表元素,而不是元组本身
在这个例子中, my_tuple 包含一个列表 [2, 3] 作为第二个元素。虽然不能更改 my_tuple 中的列表对象本身,但是可以更改该列表的内容。这并不违反元组的不可变性,因为元组中的元素引用没有改变。
再比如:
#!/sur/bin/nve python # coding: utf-8 t = [], [] print(f"\n{t = }\n\n变量t指向的对象是{t},其对象类型是{type(t)},其两个元素都是空列表。") t[0].append(4) t[-1].extend(list('abc')) print(f"\n\n我们不可以修改元组t,但是可以改变其可变对象的元素对象(本例中的可变对象是是list,对其中一个列表追加了单个元素,对另一个列表追加了一个列表):\n{t = }") t[0][-1] = 666 t[1][1] = 'OK' t[1][-1] = '梦幻精灵_cq' t[0][0] = 888 t[0].insert(0, 'DreamElf_cq') print(f"\n\n我们接着对元组t的两个列表对象进行了更多操作:\n{t = }")
- 上段代码输出截屏图片
如果截图和代码可见,可以对元组 t t t的 l i s t list list对象进行列表的所有操作,看起来是元组 t t t改变了。其实,我们改变的仅仅是元组 t t t的列表元素,元组本身仍然是不可变的。如果对t[0]、t[1]进行赋值操作,必然引发异常。
回页首上一篇: match-case与if/elif/else(python)(if/elif/else语句应对一般场景,match-case主打复杂条件分支语句)
下一篇:
我的HOT博:
本次共计收集289篇博文笔记信息,总阅读量44.72w。数据采集于2023年12月11日 23:07:13,用时5分11.8秒。阅读量不小于4.0k的有17篇。- ChatGPT国内镜像站初体验:聊天、Python代码生成等
地址:https://blog.csdn.net/m0_57158496/article/details/129035387
浏览阅读:6.2w
点赞:127 收藏:809 评论:71
(本篇笔记于2023-02-14 23:46:33首次发布,最后修改于2023-07-03 05:50:55)
- 让QQ群昵称色变的神奇代码
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
浏览阅读:5.8w
点赞:24 收藏:86 评论:17
(本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)
- Python列表(list)反序(降序)的7种实现方式
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
浏览阅读:9.9k
点赞:5 收藏:30 评论:8
(本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)
- pandas 数据类型之 DataFrame
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
浏览阅读:9.4k
点赞:7 收藏:34
摘要:pandas 数据类型之 DataFrame_panda dataframe。
(本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)
- 个人信息提取(字符串)
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
浏览阅读:7.7k
摘要:个人信息提取(字符串)_python个人信息提取。
(本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)
- Python字符串居中显示
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
浏览阅读:7.2k
评论:1
- 罗马数字转换器|罗马数字生成器
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
浏览阅读:7.2k
(本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)
- 斐波那契数列的递归实现和for实现
地址:https://blog.csdn.net/m0_57158496/article/details/122355295
浏览阅读:5.6k
点赞:4 收藏:2 评论:8
- 回车符、换行符和回车换行符
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
浏览阅读:5.5k
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
(本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)
- python清屏
地址:https://blog.csdn.net/m0_57158496/article/details/120762101
浏览阅读:5.3k
- 练习:字符串统计(坑:f‘string‘报错)
地址:https://blog.csdn.net/m0_57158496/article/details/121723096
浏览阅读:5.1k
- 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
地址:https://blog.csdn.net/m0_57158496/article/details/121645399
浏览阅读:5.1k
点赞:14 收藏:44
- 我的 Python.color() (Python 色彩打印控制)
地址:https://blog.csdn.net/m0_57158496/article/details/123194259
浏览阅读:4.6k
点赞:2 收藏:8
摘要:我的 Python.color() (Python 色彩打印控制)_python color。
(本篇笔记于2022-02-28 22:46:21首次发布,最后修改于2022-03-03 10:30:03)
- 练习:生成100个随机正整数
地址:https://blog.csdn.net/m0_57158496/article/details/122558220
浏览阅读:4.6k
(本篇笔记于2022-01-18 13:31:36首次发布,最后修改于2022-01-20 07:58:12)
- 密码强度检测器
地址:https://blog.csdn.net/m0_57158496/article/details/121739694
浏览阅读:4.4k
(本篇笔记于2021-12-06 09:08:25首次发布,最后修改于2022-11-27 09:39:39)
- 罗马数字转换器(用罗马数字构造元素的值取模实现)
地址:https://blog.csdn.net/m0_57158496/article/details/122608526
浏览阅读:4.2k
(本篇笔记于2022-01-20 19:38:12首次发布,最后修改于2022-01-21 18:32:02)
- 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
地址:https://blog.csdn.net/m0_57158496/article/details/124424935
浏览阅读:4.0k
摘要:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)_生日模拟问题,计算频率,并画出随着试验次数n的增大,频率和理论概率的 关系图。
(本篇笔记于2022-04-26 12:46:25首次发布,最后修改于2022-04-27 21:22:07)
推荐条件 阅读量突破4.0k (更多热博,请点击蓝色文字跳转翻阅)- 截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
回页首精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)
- ChatGPT国内镜像站初体验:聊天、Python代码生成等
- 上段代码输出截屏图片
- 代码运行效果截屏图片
- 上面这段代码运行效果截屏图片
- ==================================
- ==================================
- 不同点
- 相同点
- 命名元组在以下情况下特别有用: