(四)Python基礎入門-核心數據結構

概覽

  • 列表操作(增刪改查/切片/推導式)
  • 元組特性與不可變性
  • 字典操作(鍵值對/嵌套字典)
  • 集合運算(交集/并集/差集)

Python的核心數據結構是編程的基石,本文將系統講解列表、元組、字典和集合四大數據結構,包含詳細的教學內容和實用示例。

一、列表:靈活的可變序列

列表是Python中最常用的數據結構,支持存儲不同類型元素,并允許動態修改。

創建與基本操作

# 創建列表
fruits = ["apple", "banana", "cherry"]
numbers = [1, 3.14, True]  # 支持混合類型# 索引訪問(正向從0開始,負向從-1開始)
print(fruits[0])   # "apple"
print(fruits[-1])  # "cherry"# 添加元素
fruits.append("orange")       # 末尾添加 ["apple", "banana", "cherry", "orange"]
fruits.insert(1, "mango")     # 指定位置插入 ["apple", "mango", "banana", "cherry", "orange"]# 刪除元素
fruits.remove("banana")       # 按值刪除
popped = fruits.pop(2)        # 按索引刪除并返回被刪元素
del fruits[0:2]               # 刪除切片 ["cherry", "orange"]# 修改元素
fruits[0] = "kiwi"            # 直接賦值修改

切片操作詳解

切片語法:
list[start:stop:step]

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 基礎切片
print(numbers[2:5])    # [2, 3, 4]  索引2到5(不含5)
print(numbers[:3])     # [0, 1, 2]  從頭開始
print(numbers[7:])     # [7, 8, 9]  直到末尾# 步長切片
print(numbers[::2])    # [0, 2, 4, 6, 8]  每隔一個取
print(numbers[1::2])   # [1, 3, 5, 7, 9]  奇數索引
print(numbers[::-1])   # [9, 8, 7, ...]   逆序列表# 切片復制
copy = numbers[:]      # 創建全新列表副本

列表推導式實戰

列表推導式提供簡潔高效的創建方式:

# 基礎推導式
squares = [x**2 for x in range(10)]  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 條件過濾
even_squares = [x**2 for x in range(10) if x % 2 == 0]  # [0, 4, 16, 36, 64]# 嵌套推導式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]  # [1, 2, 3, 4, 5, 6, 7, 8, 9]# 帶條件轉換
grades = [85, 92, 78, 90, 65]
result = ["Pass" if score >= 70 else "Fail" for score in grades]  # ['Pass', 'Pass', 'Pass', 'Pass', 'Fail']

二、元組:不可變的守護者

元組與列表類似,但創建后不可修改,適合存儲不應改變的數據。

創建與特性

# 創建元組
colors = ("red", "green", "blue")
coordinates = (40.7128, -74.0060)  # 經緯度數據# 單元素元組需加逗號
single = ("only",)  # 注意逗號
not_tuple = ("oops")  # 這實際是字符串# 解包賦值
x, y, z = colors  # x="red", y="green", z="blue"# 不可變性驗證
try:colors[1] = "yellow"  # 嘗試修改
except TypeError as e:print(f"錯誤:{e}")  # 'tuple' object does not support item assignment

元組的實際應用場景

# 1. 函數返回多個值
def get_dimensions():return 1920, 1080width, height = get_dimensions()# 2. 字典鍵值(列表不能作為鍵)
locations = {(35.6895, 139.6917): "Tokyo",(40.7128, -74.0060): "New York"
}# 3. 保護重要數據
CONFIG = ("admin", "secure_password", 8080)
# 后續無法修改CONFIG內容# 4. 格式化字符串
print("%s 的坐標是 (%.2f, %.2f)" % ("東京", 35.68, 139.69))

元組vs列表性能對比

import sys
import timeitlist_size = sys.getsizeof([1, 2, 3, 4, 5])  # 112 bytes
tuple_size = sys.getsizeof((1, 2, 3, 4, 5))  # 88 byteslist_time = timeit.timeit("x = [1, 2, 3, 4, 5]", number=1000000)  # 約0.06秒
tuple_time = timeit.timeit("x = (1, 2, 3, 4, 5)", number=1000000) # 約0.02秒

三、字典:高效的鍵值映射

字典通過哈希表實現,具有O(1)時間復雜度的查找效率。

基礎操作詳解

# 創建字典
student = {"name": "Alice","age": 20,"courses": ["Math", "Physics"]
}# 增/改元素
student["email"] = "alice@example.com"  # 新增
student["age"] = 21  # 修改# 刪除元素
del student["courses"]  # 刪除鍵值對
age = student.pop("age")  # 刪除并返回值# 查詢元素
print(student["name"])  # 直接訪問(鍵不存在會報錯)
print(student.get("phone", "N/A"))  # 安全訪問,不存在返回默認值# 遍歷字典
for key in student:  # 遍歷鍵print(key)for key, value in student.items():  # 同時遍歷鍵值print(f"{key}: {value}")

嵌套字典實戰

# 多層嵌套結構
university = {"departments": {"CS": {"head": "Dr. Smith","courses": ["Algorithms", "AI"]},"Math": {"head": "Dr. Johnson","courses": ["Calculus", "Statistics"]}},"students": 15000
}# 訪問嵌套值
print(university["departments"]["CS"]["courses"][0])  # "Algorithms"# 修改嵌套值
university["departments"]["Math"]["head"] = "Dr. Brown"# 添加新系
university["departments"]["Physics"] = {"head": "Dr. Wilson","courses": ["Mechanics", "Quantum Physics"]
}# 安全訪問深層次鍵
from collections import defaultdict
grades = defaultdict(lambda: "N/A", {"Math": "A", "Physics": "B"})
print(grades["Chemistry"])  # 輸出 "N/A" 而不報錯

字典推導式

# 基本推導式
numbers = [1, 2, 3, 4]
squares = {x: x**2 for x in numbers}  # {1: 1, 2: 4, 3: 9, 4: 16}# 條件過濾
even_squares = {x: x**2 for x in numbers if x % 2 == 0}  # {2: 4, 4: 16}# 鍵值轉換
student = {"name": "Alice", "age": 20}
uppercase = {key.upper(): str(value).upper() for key, value in student.items()}  # {"NAME": "ALICE", "AGE": "20"}

四、集合:無序且唯一

集合用于存儲不重復元素,支持數學集合運算。

基本操作

# 創建集合
primes = {2, 3, 5, 7, 11}
evens = set([2, 4, 6, 8, 10])# 添加元素
primes.add(13)    # {2, 3, 5, 7, 11, 13}
primes.add(3)     # 重復元素自動忽略# 刪除元素
primes.remove(2)  # 刪除存在的元素
primes.discard(4) # 安全刪除(元素不存在不報錯)# 集合運算
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}print(A | B)  # 并集 {1, 2, 3, 4, 5, 6}
print(A & B)  # 交集 {3, 4}
print(A - B)  # 差集 {1, 2}
print(A ^ B)  # 對稱差 {1, 2, 5, 6}# 成員測試(O(1)時間復雜度)
if 5 in B:print("5在集合B中")

集合實際應用

# 1. 數據去重
words = ["hello", "world", "hello", "python", "world"]
unique_words = set(words)  # {"hello", "world", "python"}# 2. 關系測試
developers = {"Alice", "Bob", "Charlie"}
designers = {"Bob", "David", "Eve"}
both_roles = developers & designers  # {"Bob"}# 3. 過濾重復內容
emails = ["a@test.com", "b@test.com", "a@test.com", "c@test.com"]
unique_emails = list(set(emails))  # 去重后轉回列表# 4. 大型數據成員測試(效率遠高于列表)
big_set = set(range(1000000))
%timeit 999999 in big_set  # 約 0.03 毫秒big_list = list(range(1000000))
%timeit 999999 in big_list # 約 12 毫秒

數據結構對比與選型指南

特性列表(List)元組(Tuple)字典(Dict)集合(Set)
可變性可變不可變可變可變
排序有序有序無序(Python3.7+有序)無序
元素特性可重復可重復鍵唯一元素唯一
查找速度O(n)O(n)O(1)O(1)
內存占用中等較小較大較大
典型應用同質數據序列數據保護/常量鍵值映射去重/集合運算

選型決策樹:

  1. 需要修改元素? → 列表(有序數據)/字典(鍵值對)
  2. 需要保護數據不被修改? → 元組
  3. 需要快速查找元素? → 字典(按鍵查找)/集合(按值查找)
  4. 需要去重? → 集合
  5. 需要數學集合運算? → 集合

最佳實踐建議:

  1. 使用元組存儲不應更改的數據(如配置常量)
  2. 優先選擇字典進行鍵值映射,特別是大型數據集
  3. 使用集合推導式比循環更高效
  4. 切片操作時注意:start包含,end不包含
  5. 字典鍵必須為不可變類型(字符串、數字、元組)

掌握這些核心數據結構及其特性,能夠根據具體需求選擇最合適的工具,大幅提升代碼效率和可讀性。

本文由元來智聯開發團隊出品:元來智聯-網站、小程序等定制開發,專業開發服務商

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

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

相關文章

FCN語義分割算法原理與實戰

FCN語義分割算法原理與實戰 本文若有舛誤,尚祈諸君不吝斧正,感激不盡。 前提概要:所使用的材料來源 對應視頻材料:FCN語義分割 雖然可能比較簡單但是奠定了使用卷積神經網絡做語義分割任務的基礎。 語義分割:輸入圖片…

堆的理論知識

1 引入1.1 普通二叉樹不適合用數組存儲的原因普通二叉樹的結構是 “不規則” 的 —— 節點的左右孩子可能缺失,且缺失位置無規律。 若用數組存儲(按 “層次遍歷順序” 分配索引,即根節點放索引 0,根的左孩子放 1、右孩子放 2&…

【python實用小腳本-161】Python Json轉Xml:告別手敲標簽——一行命令把配置秒變可導入的XML

Python Json轉Xml:告別手敲標簽——一行命令把配置秒變可導入的XML 關鍵詞:json轉xml、零依賴腳本、自動生成標簽、小白友好、跨平臺故事開場:周五下午,老板又甩來“配置翻譯”任務 17:55,你正準備關機,老板…

WisFile(文件整理工具) v1.2.19 免費版

下載:https://pan.quark.cn/s/db99b679229fWisFile是一款免費AI文件管理工具,可以在電腦本地運行。它專注于解決文件命名混亂、歸類無序和手動整理耗時的問題。通過AI技術智能識別文件內容,支持批量重命名和智能分類歸檔功能,可自…

簡歷美容院:如何把“打雜經歷“包裝成“核心項目“?

簡歷美容院:如何把"打雜經歷"包裝成"核心項目"? 大家好,我是程序員小白條,今天來研究下簡歷包裝的事,小白可以按我的包裝流程走,可以分步驟進行包裝,具體怎么進行可以看正文…

零基礎-動手學深度學習-7.7 稠密連接網絡(DenseNet)

ResNet極大地改變了如何參數化深層網絡中函數的觀點。 稠密連接網絡(DenseNet)在某種程度上是ResNet的邏輯擴展。讓我們先從數學上了解一下。 7.7.1. 從ResNet到DenseNet 7.7.2. 稠密塊體 DenseNet使用了ResNet改良版的“批量規范化、激活和卷積”架構…

Marin說PCB之POC電路layout設計仿真案例---09

好消息,好消息,小編最愛的國漫凡人修仙傳電視劇版本的終于可以看了,小編我推薦一波啊,感興趣的道友們可以去某酷視頻去追劇啊。 好了,咱們言歸正傳啊。本期的案例是這個月中旬我們組的測試大哥阿永去某田實驗室去測試我…

論文閱讀--射頻電源在半導體領域的應用

《射頻電源在半導體領域的應用》 論文信息:左政,馮國楠,李建慧,等.射頻電源在半導體領域的應用[J].軟件和集成電路,2025,(04):38-43.DOI:10.19609/j.cnki.cn10-1339/tn.2025.04.007. 一、射頻電源的定義與分類 1.1 定義射頻電源(RF Power Supply&#xf…

綠算技術攜手昇騰發布高性能全閃硬盤緩存設備,推動AI大模型降本增效

在數字化浪潮席卷全球的今天,人工智能已經成為推動企業創新與發展的重要力量。廣東省綠算技術有限公司(簡稱“綠算技術”)緊跟時代步伐,基于華為昇騰AI大模型,推出了高性能全閃硬盤緩存設備,致力于為人工智…

HoloLens2系列講解 - 06 基本操作

一、導入MRTK插件 1. 首先要新建一個項目,打開unity,新建一個project。 2. 導入MRTK包。 3. 點擊 Mixed Reality Toolkit > Add to scene and Configure 添加MR場景配置文件。

Linux Vim 編輯器使用指南

Linux Vim 編輯器使用指南一、Vim 簡介 Vim(Vi IMproved)是 Linux/Unix 系統中最流行的文本編輯器之一,它是 Vi 的增強版,支持多模式操作、語法高亮、插件擴展等特性,無需鼠標即可高效編輯文本。 二、核心工作模式 Vim…

運維筆記:破解 VMware 遷移難題

一、VMware 遷移前的準備與評估1.1 遷移場景與目標分析VMware 遷移常見場景包括:同平臺升級:從 vSphere 6.7 遷移到 7.0/8.0(硬件兼容、功能迭代)跨平臺遷移:VMware→KVM/Xen(降低 licensing 成本&#xff…

cartographer 點云數據的預處理

目錄 傳感器數據的走向 體素濾波與之后的處理 3D情況下的激光雷達數據的預處理 初始位姿估計 位姿推測器的優缺點分析與總結 可能有問題的點 可能的改進建議 傳感器數據的走向 傳感器數據從CollatedTrajectoryBuilder類的HandleCollatedSensorData函數 傳遞GlobalTrajec…

基于數據挖掘的短視頻點贊影響因素分析【LightGBM、XGBoost、隨機森林、smote】

文章目錄有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主 項目介紹 隨著短視頻行業的高速發展,尤其是以抖音為代表的平臺不斷壯大&…

Git 從入門到精通

Git 從入門到精通 涵蓋了核心概念、常用命令、協作流程和高級技巧: 核心理念: 版本控制: 記錄文件變化歷史,可回溯到任意版本。分布式: 每個開發者擁有完整的倉庫副本(包括完整歷史)&#xf…

UE5多人MOBA+GAS 30、技能升級機制

文章目錄前言技能的升級修改一下按鍵的輸入判斷是否滿級在ASC中升級技能由角色的輸入調用ASC的升級功能技能圖標的優化技能升級材質,可升級技能圖標的閃爍刷新技能升級后的藍耗和CD,以及藍不夠時技能進入灰色狀態修復傷害數字特效只顯示3位數的問題前言 …

筆試——Day22

文章目錄第一題題目思路代碼第二題題目:思路代碼第三題題目:思路代碼第一題 題目 添加字符 思路 枚舉所有字符串a與字符串b相對應的位置 代碼 第二題 題目: 數組變換 思路 貪心 以最大值為基準元素,判斷其他元素能否變為最…

__getattr__和 __getattribute__ 的用法

1、__getattr__ 的用法當實例對象訪問一個不存在的屬性時,會執行 __getattr__ 方法,如果屬性存在的話,就不會執行案例 class Person:def __init__(self, name, age):self.name nameself.age agedef get_info(self):return f"name: {se…

信息化項目驗收測試實戰指南

在當今數字化轉型的大背景下,信息化項目驗收建設已成為企業提升運營效率、優化管理流程的重要手段。然而,很多企業在投入大量資金建設信息系統后,卻常常面臨系統上線后無法滿足實際業務需求的困境。究其原因,往往是由于忽視了信息…

牛頓拉夫遜法PQ分解法計算潮流MATLAB程序計算模型。

牛頓拉夫遜法&PQ分解法計算潮流MATLAB程序計算模型。本程序模型基于MATLAB進行潮流計算,建議先安裝matpower插件(MATLAB中非常重要的潮流計算的插件)。本程序可進行牛拉法和PQ分解法潮流計算的切換,對比潮流計算的結果。很適合…