Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比

以下是 Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比分析,結合了核心特性、操作方式和應用場景的深度總結:


一、核心特性對比

特性列表(List)元組(Tuple)集合(Set)字典(Dict)
定義語法[]list()()tuple(){}set(){}dict()
可變性?? 可變(增刪改)? 不可變?? 可變(元素不可變)?? 可變(鍵不可變,值可變)
有序性?? 按插入順序存儲?? 按插入順序存儲? 無序?? 有序(Python 3.7+ 保留插入順序)
元素唯一性? 允許重復? 允許重復?? 自動去重?? 鍵唯一,值可重復
內存效率較低(動態分配)較高(固定分配)中等(哈希表存儲)較高(哈希表存儲鍵值對)
典型用途動態數據集合不可變數據存儲去重、集合運算鍵值對映射

二、操作方法與功能

1. 列表(List)
  • 定義方式
    • 標準語法:用方括號 [] 包裹元素,元素間用逗號分隔
      fruits = ["apple", "banana", "orange"]
      empty_list = []  # 空列表
      
    • 動態創建:通過 list() 函數轉換其他可迭代對象
      numbers = list(range(5))  # [0, 1, 2, 3, 4]
      
  • 增刪改查
    nums = [1, 2, 3]
    nums.append(4)       # 末尾添加元素 → [1,2,3,4]
    nums.insert(1, 10)  # 插入元素 → [1,10,2,3,4]
    nums.pop()           # 刪除末尾元素 → [1,10,2,3]
    
    • 核心特性
      • 可變性:支持增刪改操作(如 append()insert()pop()
      • 有序性:元素按插入順序存儲,支持索引和切片
      • 元素類型:可包含任意數據類型(整數、字符串、列表等)
    • 適用場景:動態數據集合(如用戶輸入記錄、日志分析)
    • 高級操作:切片、列表推導式(如 [x**2 for x in range(5)]
2. 元組(Tuple)
  • 定義方式
    • 標準語法:用圓括號 () 包裹元素,元素間用逗號分隔
      coordinates = (30, 50)
      single_element = (42,)  # 單元素元組必須加逗號
      
    • 隱式定義:僅用逗號分隔元素(無需括號)
      point = 10, 20  # 自動轉為元組
      
    • 轉換生成:通過 tuple() 函數轉換其他可迭代對象
      letters = tuple("Hello")  # ('H', 'e', 'l', 'l', 'o')
      
  • 不可變特性
    point = (3, 5)
    x, y = point        # 解包 → x=3, y=5
    
  • 核心特性
    • 不可變性:創建后無法修改元素(嘗試修改會報錯)
    • 有序性:元素順序固定,支持索引和切片
    • 內存效率:因不可變性,創建和訪問速度優于列表
  • 適用場景:存儲固定數據(如配置參數、數據庫查詢結果)
  • 特殊操作:命名元組(namedtuple)增強可讀性
3. 集合(Set)
  • 定義方式

    • 標準語法:用花括號 {} 包裹元素,元素間用逗號分隔
      unique_numbers = {1, 2, 2, 3}  # 自動去重 → {1, 2, 3}
      
    • 動態創建:通過 set() 函數轉換其他可迭代對象
      letters_set = set("abracadabra")  # {'a', 'b', 'r', 'c', 'd'}
      empty_set = set()  # 空集合(不可用 {},否則為字典)
      
  • 去重與運算

    a = {1, 2, 3}
    b = {3, 4, 5}
    print(a & b)        # 交集 → {3}
    
    • 核心特性
      • 唯一性:自動去除重復元素
      • 無序性:元素無固定順序,不支持索引
      • 集合運算:支持交(&)、并(|)、差(-)等數學運算
    • 適用場景:數據去重、快速成員檢測(如唯一 IP 統計)
    • 高級操作:集合推導式(如 {x**2 for x in range(5)}
4. 字典(Dict)
  • 定義方式
    • 標準語法:用花括號 {} 包裹鍵值對,格式為 鍵: 值
      student = {"name": "小明", "age": 18}
      empty_dict = {}  # 空字典
      
    • 動態創建:通過 dict() 函數轉換鍵值對列表或元組
      key_values = [("a", 1), ("b", 2)]
      my_dict = dict(key_values)  # {'a':1, 'b':2}
      
    • 字典推導式:快速生成鍵值對
      squares = {x: x**2 for x in range(5)}  # {0:0, 1:1, ..., 4:16}
      
  • 鍵值對操作
    student = {"name": "小明", "age": 18}
    student["score"] = 90          # 添加鍵值對
    age = student.get("age", 20)   # 安全獲取值 → 18,如果沒有取到值,就給age賦值20,但dict不變
    
    • 核心特性
      • 鍵唯一性:鍵必須為不可變類型(如字符串、元組),值可重復
      • 有序性(Python 3.7+):保留插入順序
      • 快速查找:基于哈希表實現,鍵的查詢時間復雜度為 O(1)
    • 適用場景:映射關系存儲(如緩存系統、配置信息)
    • 高級操作:字典推導式(如 {x: x**2 for x in range(5)})、嵌套字典

三、性能與優化建議

  1. 查詢速度

    • 集合和字典基于哈希表實現,in 操作時間復雜度為 O(1),遠快于列表的 O(n)。
    • 示例
      # 列表 vs 集合的成員檢測性能
      list_time = timeit.timeit('99999 in my_list', setup='my_list = list(range(100000))', number=1000)
      set_time = timeit.timeit('99999 in my_set', setup='my_set = set(range(100000))', number=1000)
      
  2. 內存占用

    • 元組因不可變性內存占用最低,字典因存儲哈希表結構占用較高。
  3. 線程安全

    • 元組的不可變性天然支持多線程安全,適合共享數據場景。

四、選型決策樹

  1. 需要動態增刪?列表(如待辦事項管理)。
  2. 需要數據不可變?元組(如函數多返回值)。
  3. 需要去重或集合運算?集合(如用戶興趣標簽分析)。
  4. 需要鍵值映射?字典(如緩存系統、配置存儲)。

五、實際應用案例

  1. 元組作為字典鍵

    coordinates = {(0, 0): "原點", (1, 1): "第一象限"}  # 元組不可變,可作為鍵
    
  2. 集合快速去重

    logs = ["192.168.1.1", "10.0.0.1", "192.168.1.1"]
    unique_ips = {log.split()[0] for log in logs}  # 推導式去重
    
  3. 字典合并數據

    dict1 = {'a': 1}
    dict2 = {'b': 2}
    merged = dict1 | dict2  # Python 3.9+ 合并 → {'a':1, 'b':2}
    

六、總結

  • 列表:靈活的動態數據容器,適合頻繁修改的場景。
  • 元組:輕量級不可變結構,適合固定數據和線程安全需求。
  • 集合:高效去重與數學運算工具,適合唯一性處理。
  • 字典:鍵值映射的哈希表實現,適合快速查詢和關聯數據存儲。

通過合理選擇數據結構,可顯著提升代碼效率和可維護性。如需進一步了解具體操作,可參考各數據結構的官方文檔或示例代碼。

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

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

相關文章

Angular由一個bug說起之十五:自定義基于Overlay的Tooltip

背景 工具提示(tooltip)是一個常見的 UI 組件,用于在用戶與頁面元素交互時提供額外的信息。由于angular/material/tooltip的matTooltip只能顯示純文本,所以我們可以通過自定義Directive來實現一個靈活且功能豐富的tooltip Overlay…

軟件工程面試題(十五)

1、servlet 創建過程以及ruquest,response,session的生命周期? Servlet的創建過程: 第一步 public class AAA extends HttpServlet{ 實現對應的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker環境

背景 本人使用 Ubuntu Server 22.04 服務器&#xff0c;所以沒有圖形界面&#xff0c;而 QNX Software Center 需要圖形界面。為了保證服務器環境的整理&#xff0c;計劃使用Docker部署QNX Software Center 一瓶安裝圖形界面。本方既是實現方案的記錄。 資源 Dockerfile&…

C#/.NET/.NET Core技術前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

粘包問題解決方案

粘包問題詳解&#xff1a;TCP協議中的常見問題及Go語言解決方案 一、什么是粘包問題&#xff1f; 粘包問題是指在TCP通信中&#xff0c;發送方發送的多個獨立消息在接收方被合并成一個消息接收的現象。換句話說&#xff0c;發送方發送的多條消息在接收方被“粘”在一起&#…

vue:突然發現onok無法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果當前商品存在于商品活動庫&#xff0c;則在商品活動庫的狀態會下架",onOk: function () {that.submitForm();}}); 突然發現 this.$confirm無法進入onok 最終發現是主題沖突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表實現中&#xff0c;index hash & dict->ht[0].sizemask 是計算鍵值對應存儲位置的核心操作。這個操作看起來簡單&#xff0c;但背后涉及哈希表的內存布局和性能優化策略。我們通過以下步驟逐步解析其原理&#xff1a; 一、哈希表的設計目標 快速定位…

Ruby 命令行選項

Ruby 命令行選項 概述 Ruby 是一種廣泛使用的編程語言,它擁有強大的命令行工具,可以幫助開發者進行各種任務。了解 Ruby 的命令行選項對于提高開發效率至關重要。本文將詳細介紹 Ruby 的常用命令行選項,幫助開發者更好地利用 Ruby 的命令行功能。 Ruby 命令行選項概述 R…

【STM32】WDG看門狗(學習筆記)

學習來源----->江協科技STM32 WDG簡介 WDG&#xff08;Watchdog&#xff09;看門狗看門狗可以監控程序的運行狀態&#xff0c;當程序因為設計漏洞、硬件故障、電磁干擾等原因&#xff0c;出現卡死或跑飛現象時&#xff0c;看門狗能及時復位程序&#xff0c;避免程序陷入長…

Java 數據庫連接池

HikariCP 老外開源的。 Spring Boot 2 之后默認選擇的連接池。 號稱性能最快的數據庫連接池。 為什么性能好呢&#xff1f; ● 字節碼級別的優化-盡量的利用 JIT 的內聯手段 ● 字節碼級別的優化-利用更容易被 JVM 優化的指令 ● 代碼級別的優化-利用改造后的 FastList 代替…

Spring Boot中@Valid 與 @Validated 注解的詳解

Spring Boot中Valid 與 Validated 注解的詳解 引言Valid注解功能介紹使用場景代碼樣例 Validated注解功能介紹使用場景代碼樣例 Valid與Validated的區別結論 引言 在Spring Boot應用中&#xff0c;參數校驗是確保數據完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能擴展說明&#xff1a; 圖類封裝&#xff1a;將圖數據結構封裝為類&#xff0c;提高代碼復用性 最短路徑查找&#xff1a;基于BFS實現未加權圖的最短路徑查找 路徑重構&#xff1a;通過parent數組回溯構建完整路徑 異常處理&#xff1a;當路徑不存在時返回空向量 復雜度分析…

2023第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

本來想刷省賽題呢&#xff0c;結果一不小心刷成國賽了 真是個小迷糊〒▽〒 但&#xff0c;又如何( ?? ω ?? )? 記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 一、子2023-&#xff…

CSS學習筆記6——網頁布局

目錄 一、元素的浮動屬性、清除浮動 清除浮動的其他方法 1、使用空標簽清除浮動影響 2、使用overflow屬性清除浮動 3、使用偽元素清除浮動影響 原理 overflow屬性 二、元素的定位 1、相對定位 2、絕對定位 ?編輯 3、固定定位 z-index層疊等級屬性 一、元素的浮動…

sqlalchemy:將mysql切換到OpenGauss

說明 之前python的項目使用的mysql&#xff0c;近期要切換到國產數據庫OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;測試下來發現不用改代碼&#xff0c;只要改下配置即可。 切換方案 安裝openGauss-connector-python-psycopg2 其代碼工程在&#xff1a;https:…

uniapp 獲取dom信息(封裝獲取元素信息工具函數)

在uniapp開發中&#xff0c;需要獲取到dom的信息&#xff0c;需要用到uniapp的指定方式 uni.createSelectorQuery()&#xff0c;但是每次需要用到的時候都需要很長一段的繁瑣代碼&#xff0c;本篇文章將呈現獲取dom信息方法封裝&#xff0c;話不多說&#xff0c;上菜&#xff1…

Linux之數據鏈路層

Linux之數據鏈路層 一.以太網1.1以太網幀格式1.2MAC地址1.3MTU 二.ARP協議2.1ARP協議工作流程2.2ARP協議格式 三.NAT技術四.代理服務4.1正向代理4.2反向代理 五.四大層的學習總結 一.以太網 在我們學習完了網絡層后我們接下來就要進入數據鏈路層的學習了&#xff0c;在學習完網…

MySQL的基礎語法2(函數-字符串函數、數值函數、日期函數和流程函數 )

目錄 一、字符串函數 1.常見字符串函數 ?編輯 2.字符串函數的基本使用 3.字符串函數的數據庫案例演示 二、數值函數 1.常見數值函數&#xff08;如下&#xff09;&#xff1a; 2.數值函數的基本使用 3.數值函數的數據庫案例演示 三、日期函數 1.常見的日期函數 2.日…

全新版租賃商城小程序源碼系統 源碼開源支持二開+圖文搭建教程

在互聯網商業的浪潮中&#xff0c;租賃業務憑借其獨特的優勢&#xff0c;正逐漸成為市場的新寵。對于開發者而言&#xff0c;快速搭建一個功能完備的租賃商城小程序&#xff0c;不僅能滿足市場需求&#xff0c;還能為自己的業務拓展帶來新的機遇。分享一款全新版租賃商城小程序…

Cent OS7+Docker+Dify

由于我之前安裝了Dify v1.0.0&#xff0c;出現了一些問題&#xff1a;無法刪除&#xff0c;包括&#xff1a;知識庫中的文件、應用、智能體、工作流&#xff0c;都無法刪除。現在把服務器初始化&#xff0c;一步步重新安裝&#xff0c;從0到有。 目錄 1、服務器重裝系統和配置…