Python四大核心數據結構深度解析:列表、元組、字典與集合

在Python編程語言中,數據結構是組織和存儲數據的基本方式。Python提供了四種內置的核心數據結構:列表(List)、元組(Tuple)、字典(Dictionary)和集合(Set)。這些數據結構各有特點,適用于不同的編程場景。本文將深入探討這四種數據結構的特性、使用方法、性能考量以及實際應用場景,幫助讀者全面理解并掌握它們的正確使用方式。

一、列表(List):靈活有序的容器

1.1 列表的基本特性

列表是Python中最常用的數據結構之一,它表現為一個有序的可變序列。列表中的元素可以是任何數據類型,包括數字、字符串、甚至其他列表。

# 創建列表的多種方式
numbers = [1, 2, 3, 4, 5]
fruits = ['apple', 'banana', 'cherry']
mixed = [1, 'hello', 3.14, True]

列表的可變性是其最重要的特征之一。與字符串不同,列表創建后可以修改其中的元素,可以添加或刪除元素,也可以改變現有元素的值。

1.2 列表的常用操作

列表支持豐富的操作方法,下面是一些最常用的:

增刪改查操作:

# 添加元素
fruits.append('orange')  # 在末尾添加
fruits.insert(1, 'mango')  # 在指定位置插入# 刪除元素
del fruits[0]  # 刪除指定索引元素
fruits.remove('banana')  # 刪除指定值元素
popped = fruits.pop()  # 刪除并返回最后一個元素# 修改元素
fruits[0] = 'kiwi'# 查找元素
if 'apple' in fruits:print("蘋果在列表中")

切片操作:
列表支持強大的切片操作,可以方便地獲取子列表:

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
first_three = numbers[:3]  # [0, 1, 2]
last_three = numbers[-3:]  # [7, 8, 9]
middle = numbers[3:7]  # [3, 4, 5, 6]
every_other = numbers[::2]  # [0, 2, 4, 6, 8]
reversed_list = numbers[::-1]  # 反轉列表

1.3 列表的性能考量

雖然列表非常靈活,但在某些操作上性能并不理想:

  • 在列表開頭或中間插入/刪除元素的時間復雜度為O(n),因為需要移動后續所有元素

  • 查找元素是否在列表中(使用in操作)的時間復雜度也是O(n)

對于需要頻繁在開頭或中間插入刪除元素的場景,可以考慮使用collections.deque,它提供了O(1)時間復雜度的兩端操作。

1.4 列表推導式

Python提供了一種簡潔的創建列表的方式——列表推導式:

# 創建平方數列表
squares = [x**2 for x in range(10)]
# 帶條件的列表推導式
even_squares = [x**2 for x in range(10) if x % 2 == 0]

列表推導式不僅代碼簡潔,而且在某些情況下比普通循環更快,因為它的實現是在C語言層面優化的。

二、元組(Tuple):不可變的序列

2.1 元組的基本特性

元組與列表非常相似,都是有序的序列結構,但關鍵區別在于元組是不可變的。一旦創建,就不能修改元組的內容。

# 創建元組
coordinates = (10.0, 20.0)
colors = ('red', 'green', 'blue')
single_element = (42,)  # 注意逗號,區別于(42)

元組的不可變性帶來了幾個優勢:

  1. 安全性:數據不會被意外修改

  2. 可哈希性:可以作為字典的鍵

  3. 性能:在某些操作上比列表更快

2.2 元組的常見用途

雖然元組不如列表靈活,但在以下場景中非常有用:

作為函數的返回值:

def get_stats(data):return min(data), max(data), sum(data)/len(data)minimum, maximum, average = get_stats([1, 2, 3, 4, 5])

作為字典的鍵:

locations = {(35.6895, 139.6917): "Tokyo",(40.7128, -74.0060): "New York"
}

保護數據不被修改:
當需要確保數據在程序運行期間不被改變時,使用元組比列表更合適。

2.3 命名元組

Python的collections模塊提供了namedtuple,它是元組的子類,可以為元組的每個位置分配名稱,使代碼更易讀:

from collections import namedtuplePoint = namedtuple('Point', ['x', 'y'])
p = Point(10, y=20)
print(p.x)  # 10
print(p.y)  # 20

命名元組既有元組的不可變性和性能優勢,又提高了代碼的可讀性。

三、字典(Dictionary):高效的鍵值存儲

3.1 字典的基本特性

字典是Python中的映射類型,存儲鍵值對(key-value pairs)。字典是無序的(Python 3.7+中保持插入順序),鍵必須是不可變類型(如字符串、數字或元組),且唯一。

# 創建字典
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
grades = dict(math=90, physics=85, chemistry=88)

字典的查找速度非常快,時間復雜度接近O(1),因為它基于哈希表實現。

3.2 字典的常用操作

基本操作:

# 訪問元素
print(person['name'])  # Alice# 修改元素
person['age'] = 26# 添加元素
person['job'] = 'Engineer'# 刪除元素
del person['city']

安全訪問:

# 避免KeyError的訪問方式
age = person.get('age', 0)  # 如果'age'不存在,返回0

字典遍歷:

# 遍歷鍵
for key in person:print(key)# 遍歷鍵值對
for key, value in person.items():print(f"{key}: {value}")

3.3 字典推導式

類似于列表推導式,字典也有自己的推導式語法:

# 創建數字到其平方的映射
squares = {x: x**2 for x in range(6)}
# 帶條件的字典推導式
even_squares = {x: x**2 for x in range(6) if x % 2 == 0}

3.4 字典的高級用法

defaultdict:
collections模塊中的defaultdict可以自動為不存在的鍵創建默認值:

from collections import defaultdictword_counts = defaultdict(int)  # 默認值為0
for word in words:word_counts[word] += 1

Counter:
專門用于計數的字典子類:

from collections import Countercounts = Counter(['apple', 'banana', 'apple', 'orange'])
print(counts['apple'])  # 2

四、集合(Set):唯一元素的容器

4.1 集合的基本特性

集合是無序的、不重復元素的集合。集合的主要用途包括成員測試、消除重復元素以及數學集合運算(并集、交集、差集等)。

# 創建集合
fruits = {'apple', 'banana', 'cherry'}
numbers = set([1, 2, 3, 4, 5])

集合中的元素必須是可哈希的(不可變類型),因此列表不能作為集合元素,但元組可以。

4.2 集合操作

基本操作:

# 添加元素
fruits.add('orange')# 刪除元素
fruits.remove('banana')  # 如果不存在會引發KeyError
fruits.discard('banana')  # 安全刪除,不存在也不報錯

集合運算:

a = {1, 2, 3}
b = {2, 3, 4}# 并集
print(a | b)  # {1, 2, 3, 4}# 交集
print(a & b)  # {2, 3}# 差集
print(a - b)  # {1}# 對稱差集(僅在其中一個集合中的元素)
print(a ^ b)  # {1, 4}

4.3 集合的應用場景

去重:

unique_numbers = list(set([1, 2, 2, 3, 3, 3]))  # [1, 2, 3]

快速成員測試:
集合的成員測試時間復雜度為O(1),比列表的O(n)快得多:

if 'apple' in fruits:  # 非常高效print("找到了蘋果")

五、四種數據結構的比較與選擇

5.1 特性對比

特性列表(List)元組(Tuple)字典(Dict)集合(Set)
有序性否(Python 3.7+有序)
可變性可變不可變可變可變
元素重復允許允許鍵唯一元素唯一
查找速度O(n)O(n)O(1)O(1)
典型用途存儲序列固定數據鍵值映射唯一元素

5.2 如何選擇合適的數據結構

選擇數據結構時應考慮以下因素:

  1. 是否需要保持順序?

    • 需要:列表或元組

    • 不需要:字典或集合

  2. 是否需要修改數據?

    • 需要:列表、字典或集合

    • 不需要:元組

  3. 是否需要快速查找?

    • 需要:字典或集合

    • 不需要:列表或元組

  4. 數據是否唯一?

    • 需要唯一:集合或字典的鍵

    • 允許重復:列表或元組

  5. 是否需要鍵值關聯?

    • 需要:字典

    • 不需要:其他三種

六、實際應用案例

6.1 使用字典統計詞頻

def word_frequency(text):words = text.lower().split()frequency = {}for word in words:frequency[word] = frequency.get(word, 0) + 1return frequency# 更簡潔的Counter版本
from collections import Counterdef word_frequency(text):return Counter(text.lower().split())

6.2 使用集合找出共同好友

alice_friends = {'Bob', 'Charlie', 'Diana'}
bob_friends = {'Alice', 'Charlie', 'Eve'}common_friends = alice_friends & bob_friends
print(f"Alice和Bob的共同好友是: {common_friends}")

6.3 使用元組和字典實現簡單的學生成績系統

# 使用元組表示學生信息(學號,姓名)
students = [(1001, 'Alice'),(1002, 'Bob'),(1003, 'Charlie')
]# 使用字典存儲成績 {學號: 分數}
grades = {1001: 85,1002: 92,1003: 78
}# 查找學生成績
student_id = 1002
for id, name in students:if id == student_id:print(f"{name}的成績是: {grades.get(id, '無記錄')}")break

七、性能優化建議

  1. 優先選擇合適的數據結構:正確的數據結構選擇往往比算法優化更能提高性能

  2. 了解時間復雜度

    • 列表的insert(0, x)和pop(0)是O(n)操作

    • 集合和字典的查找是O(1)操作

  3. 考慮使用生成器表達式替代大型列表推導式以節省內存

  4. 利用內置函數:如sum(), max(), min()等,它們通常比手動循環更快

  5. 在需要頻繁修改序列兩端時,考慮使用collections.deque

總結

Python的四大數據結構——列表、元組、字典和集合,各有其獨特的特性和適用場景。理解它們的區別和優勢是寫出高效、優雅Python代碼的關鍵。列表適合有序、可變的序列;元組適合不可變的數據;字典提供了高效的鍵值映射;而集合則專精于唯一元素的存儲和集合運算。

在實際編程中,我們常常需要根據具體需求組合使用這些數據結構。例如,可以使用字典存儲復雜對象,其中值可能是列表或其他字典;可以使用元組作為字典的鍵;可以使用集合來快速去重或進行集合運算。

?

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

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

相關文章

網絡編程—Socket套接字(TCP)

上篇文章: 網絡編程—Socket套接字(UDP)https://blog.csdn.net/sniper_fandc/article/details/146923670?fromshareblogdetail&sharetypeblogdetail&sharerId146923670&sharereferPC&sharesourcesniper_fandc&sharefro…

SkyWalking+Springboot實戰(最詳細)

本篇文章記錄了作者在0到1學習SkyWalking的過程,記錄了對SkyWalking的部署,學習,使用Bug解決等等過程 一、什么是SkyWalking 官方文檔: Apache SkyWalkinghttps://skywalking.apache.org/ SkyWalking 是一個開源的分布式追蹤、性…

Arduino示例代碼講解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣

Arduino示例代碼講解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣 Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩陣功能概述硬件部分:軟件部分:代碼逐行解釋定義常量定義變量`setup()` 函數`loop()` 函數`readSensors()` 函數`refreshScr…

多線程編程中的鎖策略

目錄 1.悲觀鎖vs樂觀鎖 關鍵總結 悲觀鎖: 樂觀鎖: 選擇建議 用 悲觀鎖 當: 用 樂觀鎖 當: 2.重量級鎖vs輕量級鎖 選擇建議 用 輕量級鎖: 用 重量級鎖: 3.掛起等待鎖vs自旋鎖 關鍵細節說明 選擇…

負載均衡是什么,Kubernetes如何自動實現負載均衡

負載均衡是什么? 負載均衡(Load Balancing) 是一種網絡技術,用于將網絡流量(如 HTTP 請求、TCP 連接等)分發到多個服務器或服務實例上,以避免單個服務器過載,提高系統的可用性、可擴…

React-01React創建第一個項目(npm install -g create-react-app)

1. React特點 JSX是javaScript語法的擴展,React開發不一定使用JSX。單向響應的數據流,React實現單向數據流,減少重復代碼,比傳統數據綁定更簡單。等等 JSX是js的語法擴展,允許在js中編寫類似HTML的代碼 const …

小程序中的網絡請求

在小程序中,使用 wx.request( ) 這個方法來發送網路請求,整個請求的方式和 jQuery 里面的 $.ajax 方法是非常相似的。 在 wx.request( ) 這個方法中,接收一個配置對象,該配置對象中能夠配置的項目如下表: 關于服務器…

jvm 的attach 和agent機制

Java 的 Attach 和 Agent 機制在實際應用中得到了廣泛的成功應用,尤其是在監控、調試、性能分析、故障排查等方面。以下是這兩種機制在實際場景中的一些成功應用案例: 1. 性能監控與分析 Java Agent 和 Attach 機制廣泛應用于性能監控和分析&#xff0…

基于SpringBoot的“留守兒童網站”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“留守兒童網站”的設計與實現(源碼數據庫文檔PPT) 開發語言:Java 數據庫:MySQL 技術:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系統展示 系統整體功能圖 局部E-R圖 系統首頁界面 系統注冊…

iPhone XR:一代神機,止步于此

什么樣的 iPhone ,才配稱為一代神機? 我曾經用過iPhone 4S、iPhone 6S Plus、iPhone 8 Plus,iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷,不管囊中是否羞澀,主力機基本沒考…

【VUE】RuoYi-Vue3項目結構的分析

【VUE】RuoYi-Vue3項目結構的分析 1. 項目地址2. RuoYi-Vue3項目結構2.1 整體結構2.2 package.json2.2.1 🧾 基本信息2.2.2 🔧 腳本命令(scripts)2.2.3 🌍 倉庫信息2.2.4 📦 項目依賴(dependenc…

架構師面試(二十五):分布式存儲 Leader 設計

問題 在非常多的分布式存儲系統中,如:Zookeeper、Etcd、Kafka等,往往會存在一個 【Leader】 角色,并由該角色負責數據的寫入,這樣設計最主要的原因是什么呢? A. 唯一負責數據寫入的 Leader 角色可以避免并…

使用YoloV5和Mediapipe實現——上課玩手機檢測(附完整源碼)

目錄 效果展示 應用場景舉例 1. 課堂或考試監控(看到這個學生黨還會愛我嗎) 2. 駕駛安全監控(防止開車玩手機) 3. 企業辦公管理(防止工作時間玩手機) 4. 監獄、戒毒所、特殊場所安保 5. 家長監管&am…

GPT-4o從語義分割到深度圖生成,大模型狂潮下的計算機視覺:技術進步≠替代危機

隨著上周,GPT-4o原生多模態圖像生成功能的推出,更多玩法也被開發出來。一夜之間,GPT-4o原生多模態能力的釋放,讓圖像生成、語義分割、深度圖構建這些曾需要專業工具鏈支持的復雜任務,變成了普通人輸入一句話就能實現的…

Pytorch 張量操作

在深度學習中,數據的表示和處理是至關重要的。PyTorch 作為一個強大的深度學習框架,其核心數據結構是張量(Tensor)。張量是一個多維數組,類似于 NumPy 的數組,但具有更強大的功能,尤其是在 GPU …

小程序中跨頁面組件共享數據的實現方法與對比

小程序中跨頁面/組件共享數據的實現方法與對比 在小程序開發中,實現不同頁面或組件之間的數據共享是常見需求。以下是幾種主要實現方式的詳細總結與對比分析: 一、常用數據共享方法 全局變量(getApp())、本地緩存(w…

vue中的 拖拽

拖拽總結 實現方式特點適用場景HTML5 原生拖拽 API? 直接使用 dataTransfer 進行數據傳輸 ? 兼容性好(大部分瀏覽器支持) ? 適合簡單的拖拽場景低代碼平臺、表單生成器、組件拖拽Vue/React 組件庫(如 Vue Draggable、SortableJS&#xff…

MySQL 函數(入門版)

目錄 一、字符串函數 1、常用的字符串函數 2、函數演示 3、具體案例 二、數值函數 1、常用的數值函數 2、函數演示 3、具體案例 三、日期函數 1、常用的日期函數 2、函數演示 3、具體案例 四、流程函數 1、常用的流程函數 2、函數演示 3、具體案例 在MySQL中&a…

基于快速開發平臺與智能手表的區域心電監測與AI預警系統(源碼+論文+部署講解等)

需要源代碼,演示視頻,ppt設計原稿資料,請文末卡片聯系 !](https://i-blog.csdnimg.cn/direct/242d53cd069940b5b7a6db2bb031d406.png#pic_center)

【神經網絡】python實現神經網絡(三)——正向學習的模擬演練

有了之前的經驗(【神經網絡】python實現神經網絡(二)——正向推理的模擬演練),我們繼續來介紹如何正向訓練神經網絡中的超參(包含權重以及偏置),本章大致的流程圖如下: 一.損失函數 神經網絡以某個指標為基準尋求最優權重參數,而這個指標即可稱之為 “損失函數” 。(…