命名元组(python)

命名元组与元组的差异,命名元组和字典,哪个效率更高。


(笔记模板由python脚本于2024年02月26日 12:31:36创建,本篇笔记适合熟悉python元组和字典的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


命名元组与元组的差异
命 名 元 组
(命名元组和字典,哪个效率更高)


本文质量分:

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数据创建</font>
      • 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篇。

  1. 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)

  2. 让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)

  3. 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)

  4. 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)

  5. 个人信息提取(字符串)
    地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    浏览阅读:7.7k
    摘要:个人信息提取(字符串)_python个人信息提取。
    (本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)

  6. Python字符串居中显示
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    浏览阅读:7.2k
    评论:1
  7. 罗马数字转换器|罗马数字生成器
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    浏览阅读:7.2k
    (本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)

  8. 斐波那契数列的递归实现和for实现
    地址:https://blog.csdn.net/m0_57158496/article/details/122355295
    浏览阅读:5.6k
    点赞:4 收藏:2 评论:8
  9. 回车符、换行符和回车换行符
    地址: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)

  10. python清屏
    地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    浏览阅读:5.3k
  11. 练习:字符串统计(坑:f‘string‘报错)
    地址:https://blog.csdn.net/m0_57158496/article/details/121723096
    浏览阅读:5.1k
  12. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
    地址:https://blog.csdn.net/m0_57158496/article/details/121645399
    浏览阅读:5.1k
    点赞:14 收藏:44 
  13. 我的 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)

  14. 练习:生成100个随机正整数
    地址:https://blog.csdn.net/m0_57158496/article/details/122558220
    浏览阅读:4.6k
    (本篇笔记于2022-01-18 13:31:36首次发布,最后修改于2022-01-20 07:58:12)

  15. 密码强度检测器
    地址:https://blog.csdn.net/m0_57158496/article/details/121739694
    浏览阅读:4.4k
    (本篇笔记于2021-12-06 09:08:25首次发布,最后修改于2022-11-27 09:39:39)

  16. 罗马数字转换器(用罗马数字构造元素的值取模实现)
    地址:https://blog.csdn.net/m0_57158496/article/details/122608526
    浏览阅读:4.2k
    (本篇笔记于2022-01-20 19:38:12首次发布,最后修改于2022-01-21 18:32:02)

  17. 练习:班里有人和我同生日难吗?(概率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 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


  • 31
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值