Python中的`namedtuple`:命名元组的用法与优势

news/2025/10/7 23:31:24/文章来源:https://www.cnblogs.com/wangya216/p/19129024

Python中的namedtuple:命名元组的用法与优势

collections.namedtuple是Python标准库提供的一个实用工具,它创建的是一种带字段名的元组,兼具元组的不可变性和类的可读性,是处理简单数据结构的理想选择。

一、namedtuple的基本概念

普通元组(tuple)只能通过索引访问元素,缺乏可读性;而namedtuple允许为元组的每个位置指定名称,既保留了元组的轻量性,又能通过名称访问元素,让代码更清晰。

定义方式

from collections import namedtuple# 定义一个namedtuple:第一个参数是类名,第二个参数是字段名列表
Card = namedtuple('Card', ['rank', 'suit'])  # 等价于 Card = namedtuple('Card', 'rank suit')
  • 第一个参数'Card':创建的类名(通常与变量名一致,也可不同)
  • 第二个参数['rank', 'suit']:字段名列表(可用空格分隔的字符串代替,如'rank suit'

二、namedtuple的核心特性

1. 兼具元组的不可变性和类的字段访问

# 创建实例
card = Card(rank='A', suit='spades')  # 或 Card('A', 'spades')# 通过字段名访问(类的特性)
print(card.rank)  # 'A'
print(card.suit)  # 'spades'# 通过索引访问(元组的特性)
print(card[0])    # 'A'
print(card[1])    # 'spades'# 不可变性(元组的特性)
card.rank = 'K'  # 报错:'Card' object does not support item assignment

2. 内置实用方法

namedtuple自动生成了一些实用方法,方便操作:

(1)_fields:查看所有字段名

print(Card._fields)  # ('rank', 'suit')

(2)_make():通过可迭代对象创建实例

data = ('Q', 'hearts')
card = Card._make(data)
print(card)  # Card(rank='Q', suit='hearts')

(3)_asdict():转换为字典(Python 3.1+)

card = Card('K', 'diamonds')
print(card._asdict())  # {'rank': 'K', 'suit': 'diamonds'}

(4)_replace():创建修改后的新实例(原实例不变)

card = Card('2', 'clubs')
new_card = card._replace(rank='3')  # 原实例card保持不变
print(new_card)  # Card(rank='3', suit='clubs')

三、namedtuple的适用场景

1. 替代普通元组,提升代码可读性

普通元组的索引访问缺乏语义,namedtuple的字段名让数据含义更清晰:

# 普通元组(可读性差)
person = ('Alice', 25, 'female')
print(person[0])  # 谁知道0代表姓名?# namedtuple(可读性好)
Person = namedtuple('Person', 'name age gender')
person = Person('Alice', 25, 'female')
print(person.name)  # 明确知道是访问姓名

2. 替代简单类(无复杂方法的类)

如果一个类仅用于存储数据,没有复杂的方法,namedtuple是更简洁的选择:

# 传统类写法
class Point:def __init__(self, x, y):self.x = xself.y = y# namedtuple写法(更简洁)
Point = namedtuple('Point', 'x y')

3. 作为字典的轻量替代

字典占用内存更多,而namedtuple更轻量,且字段固定:

# 存储大量坐标数据时,namedtuple更高效
points = [Point(x, y) for x in range(100) for y in range(100)]

四、namedtuple与其他数据结构的对比

数据结构 优势 劣势
namedtuple 轻量、不可变、支持字段名和索引访问 字段固定,无法动态添加属性
普通tuple 轻量、不可变 仅支持索引访问,可读性差
普通class 可定义方法,支持动态添加属性 内存占用高,代码冗余
dict 灵活,支持动态添加键值对 内存占用高,字段无固定性

五、注意事项

  1. 不可变性namedtuple实例创建后无法修改字段值(同元组),如需修改需用_replace()创建新实例。
  2. 字段名限制:字段名不能是Python关键字(如classdef),也不能包含空格或特殊字符。
  3. 继承问题namedtuple创建的类继承自tuple,如需扩展功能,可通过子类实现:
    class ExtendedCard(Card):def is_ace(self):return self.rank == 'A'  # 判断是否为A牌
    

总结

namedtuple是一种兼具可读性和效率的数据结构,适用于:

  • 存储简单数据(如坐标、记录、配置等)
  • 替代索引访问的普通元组,提升代码可读性
  • 作为轻量级数据类,替代仅含__init__的简单类

在之前的扑克牌例子中,Card = namedtuple('Card', ['rank', 'suit'])创建了一个卡牌数据结构,既可以通过card.rank清晰访问点数,又保持了元组的轻量和不可变性,是非常合适的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android开发者网站中国最近战争新闻

CortexM3存储器系统 宗旨:技术的学习是有限的,分享的精神是无限的。 CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种 CM3 单片机间的移植。 存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私…

一摞python风格的纸牌

一摞python风格的纸牌 import collections# 定义卡牌类 Card = collections.namedtuple(Card, [rank, suit])# 法式扑克牌类 class FrenchDeck:ranks = [str(n) for n in range(2, 11)] + list(JQKA)suits = spades di…

记录一个ubuntu24.04蓝牙不显示不可用的解决方案

记录一个奇怪的ubuntu24.04桌面端的蓝牙标志消失处理办法 现象: 1.蓝牙开关消失,提示plug in a dongle to use bluetooth 2.服务日志提示:Bluetooth service was skipped because of an unmet condition check (Con…

网站开发电脑配置推荐网站流量 seo

客户简介 岗岭集团是中国互联网医药健康的领军企业,致力于用互联网模式和思维方式,改变中国大众“看病难、买药贵”的现状。岗岭集团运用创新的互联网和IT技术提供在线诊疗、购药和健康管理等服务,缩减中间环节,优化供应链&#…

社区门户网站建设方案雅式机械加工网

当我们找工作的时候查看招聘信息发现都需要有自动化测试经验,由此看来测试人员不会一点自动化测试技术都不好意思说自己是做软件测试的。大部分测试人员也都是从使用自动化测试工具、录制回放、测试脚本、开发小工具入门自动化测试的,然后在慢慢的接触 U…

惠州模板网站WordPress wlw设置

简单的说time()与$_SERVER["REQUEST_TIME"]都是获得时间的,但time返回当前的 Unix 时间戳而$_SERVER["REQUEST_TIME"]得到请求开始时的时间戳,稍有区别。1. time() 获取当前的系统时间戳inttime( void ) :返回自从 Unix 纪元(格林威…

directx 与d3d 什么关系

directx 与d3d 什么关系1. DirectX 是一个“套件”DirectX (Direct eXtension) 不是单一库,而是 微软在 Windows 平台上提供的一整套多媒体 API。主要模块包括:Direct3D (D3D) → 3D 图形DirectDraw → 2D 图形(后来…

数据仓库中的“时间旅行者”:深入理解渐变维度(SCD)与拉链表

某电商平台的用户“小美”昨天刚从上海搬到北京,现在住在北京的一家单身公寓里。“小美” 很热爱生活,喜欢烘培烹饪、逛展会、户外旅行等活动。为了满足自己的个性化需求,她选择成为一名电商“重度使用者”。她尤其…

MOVEit网络攻击波及普华永道与安永,供应链安全再响警钟

勒索软件团伙Clop利用MOVEit文件传输服务的零日漏洞发起供应链攻击,导致普华永道、安永等多家知名机构数据泄露。攻击者要求受害企业在6月14日前支付赎金,美国网络安全机构已发布安全补丁。MOVEit网络攻击波及普华永…

Penchick Online Mathematical Olympiad, Qualifying Test 1, III.4

原题链接:https://artofproblemsolving.com/community/c4h3687790_1st_penchick_online_mathematical_olympiad_qualifying_test_1_iii4 解答: 令 , . (统一分母)整理得:代入原式 均值不等式(AM-GM)得到最小 , …

自己做网站别人怎么看见wordpress搬家后全部页面404

目录 1.hdfs读写流程解析 2.hdfs副本机制,三副本原因,副本存放策略 3.hdfs容错机制原理 4.MapReduce执行流程详解 5.spark和mr的区别 6.TopN求法,大数据量无法完全写入内存解决方案,MapReduce实现方法 7.spark部署、调度原…

QBXT2025S刷题 Day6

T2 这道题是树形 \(\mathcal{DP}\),我们注意到如果一个点能和他的一个子树合并成为一个三叉,那么可以是以下四种情况。然后我们的状态记录一下当前有 \(i\) 个链,\(j\) 个倒 "Y"。 这样,我们可以先让 \(…

dx为什么用com

dx为什么用com1. DirectX 的历史背景DirectX 是 90 年代微软为 Windows 游戏/多媒体开发出的 API。当时 Windows 上最通用的组件化技术就是 COM(Component Object Model)。DirectX 各子系统(D3D、DirectSound、Dire…

我的网站现在没有排名_我想问是不是花钱做百度推广就会有排名网站怎么加入百度网盟

一、前言 本人面试已经很久之前了,分享一下我做美团面试官的经历吧。 美团上海面试,2-1及以下美团是不社招的,校招和2-2~2-3社招一般是三面,格外优秀3-1及以上会加签面试。初面技术基础,二面业务感知和技术项目&#…

北京网站制作闪快网站备案手机号

每到周末的时候,我就感到压抑,无处可去,无事可做,我为什么那么在乎别人的看法呢?从不主动和人交流,话少的可怜,我一周说的话手指都能数出来,总是感到尴尬,不说话还常常苦闷别人不理…

图书馆网站建设工作阿里云企业网站搭建

很多人的电脑或者手机上都离不开一款好用的便签软件,使用便签软件可以帮助大家记事,提醒大家按时完成各项任务,但是自带的记事本便签软件不论从外观还是功能方面都有一定的欠缺,在使用过程中很容易耽误事情。 功能全面外观好看的…

建设网站的内容规划网络公司seo教程

Hello,今天事10月27日,距离刚开始写博客已经过去挺久了,我也不知道是什么让我坚持这么久,但是学校的课真的很多,很少有时间多出来再学习,有些科目马上要考试了,我还不知道我呢不能过哈哈哈&…

建立自己的平台网站吗php开发的大型网站有哪些

1、实验目的 通过本实验可以掌握: CLI的各种工作模式个CLI各种编辑命令“?” 和【Tab】键使用方法IOS基本命令网络设备访问限制查看设备的相关信息 2、实验拓扑 CLI的使用与IOS基本命令使用拓扑如下图所示。 3、实验步骤 (1)CLI模式的切…

CF2145 Educational Codeforces Round 183 (Rated for Div. 2) 游记

高罚时开出三题,掉分 $93$,心如止水。省流 高罚时开出三题,掉分 \(93\),心如止水。10.6 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 前一天 \(qwsxza\) 一把上分 \(136\) 极大的激励了我,今天在电脑前不…

江苏网站备案要求如何做网站的百科

大多数WordPress站点首页默认都是显示最新发布的文章列表,不过有些站点比较特殊,只想显示某一篇文章的全部内容,那么应该怎么设置呢? 其实,WordPress后台 >> 设置 >> 阅读 >> 在“您的主页显示”中…