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.mzph.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实现神经网络(二)——正向推理的模拟演练),我们继续来介绍如何正向训练神经网络中的超参(包含权重以及偏置),本章大致的流程图如下: 一.损失函数 神经网络以某个指标为基准寻求最优权重参数,而这个指标即可称之为 “损失函数” 。(…