【Python 命名元祖】collections.namedtuple 學習指南

📚 collections.namedtuple 學習指南
命名元組(namedtuple)是 Python collections 模塊中一種增強型元組,支持通過字段名訪問元素,同時保持元組的內存效率和不可變性。


一、基礎用法

1. 定義命名元組
from collections import namedtuple# 定義 Point 類型(字段名用空格或列表分隔)
Point = namedtuple('Point', ['x', 'y'])
# 或簡寫為
Point = namedtuple('Point', 'x y')# 實例化對象
p = Point(10, y=20)  # 類似常規元組或類構造
print(p)             # 輸出: Point(x=10, y=20)
2. 訪問元素
print(p.x)    # 10(通過字段名)
print(p[0])   # 10(通過索引,保留元組特性)

二、核心特性

1. 不可變性

命名元組繼承自普通元組,元素不可修改

# 以下操作會報錯
p.x = 100  # AttributeError: can't set attribute
2. 輕量級類替代

相比傳統類,命名元組更簡潔:

# 等價于以下類定義
class PointClass:def __init__(self, x, y):self.x = xself.y = y

三、方法與屬性

1. 常用方法
方法功能示例
_asdict()轉為 OrderedDictp._asdict(){'x':10, 'y':20}
_replace(**kwargs)創建新實例并替換字段值p._replace(x=100)Point(x=100, y=20)
_make(iterable)通過可迭代對象創建實例Point._make([30, 40])Point(x=30, y=40)
2. 元數據屬性
print(p._fields)  # 輸出字段名元組: ('x', 'y')# 可擴展新類型(通過繼承)
Point3D = namedtuple('Point3D', Point._fields + ('z',))

四、進階應用

1. 字典互轉
# 轉字典(Python 3.7+ 返回普通字典)
d = p._asdict()  # {'x': 10, 'y': 20}# 從字典創建
data = {'x': 30, 'y': 40}
p_new = Point(**data)  # Point(x=30, y=40)
2. 默認值與可選參數

通過定義子類添加默認值:

class PointDefault(Point):__slots__ = ()def __new__(cls, x=0, y=0):return super().__new__(cls, x, y)p_default = PointDefault()  # Point(x=0, y=0)
3. 添加方法
class PointWithMethods(Point):def distance(self, other):return ((self.x - other.x)**2 + (self.y - other.y)**2)**0.5p1 = PointWithMethods(1, 2)
p2 = PointWithMethods(4, 6)
print(p1.distance(p2))  # 輸出 5.0

五、實際應用場景

1. 數據庫查詢結果
import sqlite3conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('SELECT id, name, age FROM users')# 將每行轉為命名元組
User = namedtuple('User', 'id name age', module=__name__)
users = [User(*row) for row in cursor.fetchall()]print(users[0].name)  # 通過字段名訪問數據
2. CSV 文件解析
import csvwith open('data.csv') as f:reader = csv.reader(f)header = next(reader)Row = namedtuple('Row', header)for r in reader:row = Row(*r)print(row.date, row.value)  # 按字段名訪問列
3. 替代簡單類
# 表示 RGB 顏色
Color = namedtuple('Color', 'red green blue')
white = Color(255, 255, 255)# 函數返回多個命名值
def get_dimensions():return namedtuple('Size', 'width height')(1920, 1080)screen = get_dimensions()
print(f"分辨率: {screen.width}x{screen.height}")

六、命名元組 vs 其他數據結構

特性命名元組字典普通類
內存占用較大較大
訪問速度快速(通過索引和字段名)略慢(哈希查找)略慢(屬性訪問)
可變性不可變可變可變
語法簡潔性低(需定義類)
代碼可讀性高(明確字段名)一般

七、注意事項

1. 字段名規范
  • 字段名不能是 Python 關鍵字(如 class, def)。
  • 字段名不可重復,否則報錯:
    # 錯誤示例
    Invalid = namedtuple('Invalid', 'x x')  # ValueError: 重復字段名
    
2. 不可變性的權衡
  • 優點:線程安全、哈希可用性(可作為字典鍵)。
  • 缺點:需要創建新實例以實現“修改”。

八、總結

命名元組是以下場景的理想選擇:

  • 需要輕量級不可變數據結構
  • 希望通過字段名提高代碼可讀性
  • 需將數據作為字典鍵使用(普通字典鍵需用元組)。

進一步學習

  • Python 官方文檔 - namedtuple
  • 探索 typing.NamedTuple(Python 3.6+)以支持類型注解!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82221.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS知識復習

block原理 OC block 是個結構體,內部有個一個結構體成員 專門保存 捕捉對象 Swift閉包 是個函數,捕獲了全局上下文的常量或者變量 修改數組存儲的內容,不需要加_block,修改數組對象本身時需要 weak原理 Weak 哈希表 (散列表&a…

手眼標定:九點標定、十二點標定、OpenCV 手眼標定

因為一直使用6軸協作機器人,且主要應用是三維視覺,平常的手眼標定基本都是基于OpenCV來計算的,聽說有九點標定和十二點標定,順便了解下。 目錄 1.九點標定1.1 基本原理1.2 關于最小二乘法1.3 具體示例 2.十二點標定3.OpenCV 手眼標…

CSS之元素定位

元素定位 一、什么是元素定位 元素定位(CSS Positioning) 是指通過CSS的 position 屬性控制HTML元素在頁面中的布局方式。它決定了元素如何相對于其父元素、視口或其他元素進行位置調整。 CSS的 position 屬性用于控制元素在頁面上的定位方式&#xff…

測試工程師如何通俗理解和入門RAG:從“查資料”到“寫答案”的智能升級

1. 為什么要學習RAG?——從“查資料”到“寫答案”的飛躍 背景:你已經掌握了Embedding技術,能將文檔、代碼、測試用例等離散信息轉化為向量,用于相似度匹配。 痛點:但僅靠向量匹配找到相關文檔后,如何快速生成答案?如何避免“找到文檔卻不會總結”的尷尬? RAG的價值:…

數量優勢:使用Bagging和Boosting的集成模型

文章目錄 裝袋法(Bagging)和提升法(Boosting)利用集成學習創建強大的模型裝袋法(Bagging):為機器學習模型增加穩定性裝袋法示例 提升法(Boosting):減少弱學習…

5G基站選擇±10ppm晶振及低相噪技術解析

在5G通信技術飛速發展的時代,5G基站作為核心基礎設施,其性能的優劣直接影響著整個通信網絡的質量。晶振作為5G基站中的關鍵器件,對基站的頻率穩定性、信號傳輸質量等起著至關重要的作用。 5G基站對晶振的要求 (一)高…

嵌入式<style>設計模式

每天分享一個web前端開發技巧。 今天分享的主題是&#xff0c;如何提升前端代碼的內聚性。我們在寫<style></style>的時候&#xff0c;往往把大量無關聯的樣式寫在同一個<style>下&#xff0c;而且離相關的html元素很遠&#xff0c;這樣導致每次想修改某個元…

簡單數學板子和例題

線性丟番圖方程 axbyc dgcd(a,b)&#xff0c;若c|d&#xff0c;有無窮整數解 x x 0 b d n , y y 0 ? a d n xx_0{b\over d}n,yy_0-{a\over d}n xx0?db?n,yy0??da?n POJ 1265 poj真難用&#xff0c;abs一直報錯&#xff0c;萬能頭也不能用&#xff0c;給我調紅溫了 …

深度解析視頻剪輯SDK開發:從AI字幕提取到多端原生插件集成-優雅草卓伊凡

深度解析視頻剪輯SDK開發&#xff1a;從AI字幕提取到多端原生插件集成-優雅草卓伊凡 引言&#xff1a;視頻剪輯技術的演進與市場需求 近年來&#xff0c;短視頻和社交媒體的爆發式增長推動了視頻剪輯技術的快速發展。優雅草卓伊凡及其團隊近期接到一個客戶需求&#xff1a;開…

對WireShark 中的EtherCAT抓包數據進行解析

對WireShark 中的EtherCAT抓包數據進行解析 EtherCAT數據包結構 EtherCAT數據幀結構如下&#xff1a; 采用 Python 實現對 EtherCAT 數據包進行解析 import numpy as np import matplotlib.pyplot as plt from IPython import embed from collections import Counter import …

基于SpringBoot的校園電競賽事系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

數據湖和數據倉庫的區別

在當今數據驅動的時代&#xff0c;企業需要處理和存儲海量數據。數據湖與數據倉庫作為兩種主要的數據存儲解決方案&#xff0c;各自有其獨特的優勢與適用場景。本文將客觀詳細地介紹數據湖與數據倉庫的基本概念、核心區別、應用場景以及未來發展趨勢&#xff0c;幫助讀者更好地…

Mysql 刷題Day09

LC 585 2016年的投資 思路&#xff1a; 本題思路好想 &#xff0c; 就是把2015年投資相同的找出來 &#xff0c;再找出這其中經緯度不同的id對應的2016年的保險。 實際操作中&#xff0c; 發現用group by很麻煩&#xff0c; 那么想到窗口函數也能 分組進行統計 利用 count(…

Lambda表達式的方法引用詳解

Lambda表達式的方法引用詳解 1. 方法引用的概念與作用 定義:方法引用(Method Reference)是Lambda表達式的一種簡化寫法,允許直接通過方法名引用已有的方法。核心目的:減少冗余代碼,提升可讀性,尤其在Lambda僅調用一個現有方法時。語法符號:雙冒號 ::。2. 方法引用的四種…

記錄python在excel中添加一列新的列

思路是&#xff0c;先將需要添加為新的列存儲到一個暫時的列表中&#xff0c;然后用到以下函數來存儲 data_.loc[:, "新列的名字"] save_list_ 上面的save_list_就是暫時存儲了信息的列表了。 以下是我的代碼&#xff0c;供以后快速回憶。 schools_data {"98…

關于flutter中Scaffold.of(context).openEndDrawer();不生效問題

原因&#xff1a; 在 Flutter 中&#xff0c;Scaffold.of(context) 會沿著當前的 context 向上查找最近的 Scaffold。如果當前的 widget 樹層級中沒有合適的 Scaffold&#xff08;比如按鈕所在的 context 是在某個子 widget 中&#xff09;&#xff0c;就找不到它。 解決辦法…

財管-1-財務分析、評價和預測

1.因素分析法&#xff1a; 報告期&#xff08;實際&#xff09;指標M1A1 * B1 * C1 基 期&#xff08;計劃&#xff09;指標M0A0 * B0 * C0……&#xff08;1&#xff09; 第一次替代 A1 * B0 * C0……&#xff08;2&#xff09; 第二次替代 A1 * B1 * C0……&#xff08;3…

golang逃逸分析

1.1 逃逸分析是什么 逃逸分析是指編譯器在執行靜態代碼分析后&#xff0c;對內存管理進行的優化和簡化。 在編譯原理中&#xff0c;分析指針動態范圍的方法被稱為逃逸分析。通俗來講&#xff0c;當一個對象的指針被多個方法或線程引用時&#xff0c;則稱這個指針發生了逃逸。…

Meetily:AI會議記錄,開源、免費、好用(本地AI實時轉錄、隱私保護一步到位!)

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、初識Meetily:什么是真正的智能會議助手?1. 核心優勢一覽2. 技術架構揭秘二、實戰體驗:從安裝到使用的完整流程1. 系統要求2. 快速安裝指南Wi…

.NET ORM開發手冊:基于SqlSugar的高效數據訪問全攻略

SqlSuger是一個國產&#xff0c;開源ORM框架&#xff0c;具有高性能&#xff0c;使用方便&#xff0c;功能全面的特點&#xff0c;支持.NET Framework和.NET Core&#xff0c;支持各種關系型數據庫&#xff0c;分布式數據庫&#xff0c;時序數據庫。 官網地址&#xff1a;SqlS…