(四)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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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分解法潮流计算的切换,对比潮流计算的结果。很适合…