Python入门:Python3 数据结构全面学习教程
Python入门:Python3 数据结构全面学习教程
Python入门:Python3 数据结构全面学习教程,本文详细介绍Python3常用数据结构及遍历技巧。列表为可变序列,含丰富操作方法,可实现栈和队列,还可通过推导式及嵌套解析高效处理数据,del语句能删除元素或变量。元组是不可变序列,由逗号分隔值组成,可嵌套。集合为无序不重复元素集,支持关系测试和推导式。字典以键值对存储,关键字不可变且唯一,有多种构造方式。此外,还讲解了字典、序列等的遍历技巧,如用items()、enumerate()、zip()等函数,助力高效编程。

前言
Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。
🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。
🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。
🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。
🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。
🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。
🌐 前篇文章咱们讲解了 Python入门:Python3 装饰器全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们学习 Python3 数据结构全面学习教程,下面开始吧!
在 Python 编程中,数据结构是处理和组织数据的基础。掌握好各种数据结构的特性和用法,能让我们更高效地编写代码。本文将详细介绍 Python3 中常用的数据结构,包括列表、元组、集合、字典等,以及它们的操作方法和实际应用场景。
一、列表(List)
列表是 Python 中最常用的数据结构之一,它是可变的,这也是它与字符串和元组最显著的区别,即列表可以修改,而字符串和元组不能。
列表的常用方法
列表提供了丰富的方法来操作元素,如下表所示:
| 方法 | 描述 |
|---|---|
| list.append(x) | 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x] |
| list.extend(L) | 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L |
| list.insert(i, x) | 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引 |
| list.remove(x) | 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误 |
| list.pop([i]) | 从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素 |
| list.clear() | 移除列表中的所有项,等于del a[:] |
| list.index(x) | 返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误 |
| list.count(x) | 返回 x 在列表中出现的次数 |
| list.sort() | 对列表中的元素进行排序 |
| list.reverse() | 倒排列表中的元素 |
| list.copy() | 返回列表的浅复制,等于a[:] |
列表方法示例演示
下面通过一个实例来演示列表的大部分方法:
a =[66.25,333,333,1,1234.5]print(a.count(333), a.count(66.25), a.count('x'))# 输出:2 1 0 a.insert(2,-1) a.append(333)print(a)# 输出:[66.25, 333, -1, 333, 1, 1234.5, 333]print(a.index(333))# 输出:1 a.remove(333)print(a)# 输出:[66.25, -1, 333, 1, 1234.5, 333] a.reverse()print(a)# 输出:[333, 1234.5, 1, 333, -1, 66.25] a.sort()print(a)# 输出:[-1, 1, 66.25, 333, 333, 1234.5]需要注意的是,类似 insert、remove 或 sort 等修改列表的方法没有返回值。
将列表当作栈使用
栈是一种后进先出(LIFO, Last-In-First-Out)的数据结构,意味着最后添加的元素最先被移除。在 Python 中,可以使用列表来实现栈的功能,主要用到 append() 和 pop() 方法。
栈的基本操作及实现如下:
- 创建一个空栈
stack =[]- 压入(Push)操作:使用 append() 方法将元素添加到栈的顶端
stack.append(1) stack.append(2) stack.append(3)print(stack)# 输出: [1, 2, 3]- 弹出(Pop)操作:使用 pop() 方法移除并返回栈顶元素
top_element = stack.pop()print(top_element)# 输出: 3print(stack)# 输出: [1, 2]- 查看栈顶元素(Peek/Top):直接访问列表的最后一个元素(不移除)
top_element = stack[-1]print(top_element)# 输出: 2- 检查是否为空(IsEmpty):检查列表是否为空
is_empty =len(stack)==0print(is_empty)# 输出: False- 获取栈的大小(Size):使用 len() 函数获取栈中元素的数量
size =len(stack)print(size)# 输出: 2我们还可以封装一个 Stack 类来实现栈的功能:
classStack:def__init__(self): self.stack =[]defpush(self, item): self.stack.append(item)defpop(self):ifnot self.is_empty():return self.stack.pop()else:raise IndexError("pop from empty stack")defpeek(self):ifnot self.is_empty():return self.stack[-1]else:raise IndexError("peek from empty stack")defis_empty(self):returnlen(self.stack)==0defsize(self):returnlen(self.stack)# 使用示例 stack = Stack() stack.push(1) stack.push(2) stack.push(3)print("栈顶元素:", stack.peek())# 输出: 栈顶元素: 3print("栈大小:", stack.size())# 输出: 栈大小: 3print("弹出元素:", stack.pop())# 输出: 弹出元素: 3print("栈是否为空:", stack.is_empty())# 输出: 栈是否为空: Falseprint("栈大小:", stack.size())# 输出: 栈大小: 2将列表当作队列使用
队列是一种先进先出(FIFO, First-In-First-Out)的数据结构,意味着最早添加的元素最先被移除。
使用列表直接实现队列并不是最优选择,因为在列表开头插入或删除元素的时间复杂度是 O(n)。Python 提供了 collections.deque,它是双端队列,可以在两端高效地添加和删除元素,时间复杂度为 O(1)。
使用 collections.deque 实现队列
from collections import deque # 创建一个空队列 queue = deque()# 向队尾添加元素 queue.append('a') queue.append('b') queue.append('c')print("队列状态:", queue)# 输出: 队列状态: deque(['a', 'b', 'c'])# 从队首移除元素 first_element = queue.popleft()print("移除的元素:", first_element)# 输出: 移除的元素: aprint("队列状态:", queue)# 输出: 队列状态: deque(['b', 'c'])# 查看队首元素(不移除) front_element = queue[0]print("队首元素:", front_element)# 输出: 队首元素: b# 检查队列是否为空 is_empty =len(queue)==0print("队列是否为空:", is_empty)# 输出: 队列是否为空: False# 获取队列大小 size =len(queue)print("队列大小:", size)# 输出: 队列大小: 2使用列表实现队列
虽然 deque 更高效,但也可以使用列表来实现队列:
- 创建队列
queue =[]- 向队尾添加元素:使用 append() 方法
queue.append('a') queue.append('b') queue.append('c')print("队列状态:", queue)# 输出: 队列状态: ['a', 'b', 'c']- 从队首移除元素:使用 pop(0) 方法
first_element = queue.pop(0)print("移除的元素:", first_element)# 输出: 移除的元素: aprint("队列状态:", queue)# 输出: 队列状态: ['b', 'c']- 查看队首元素(不移除):直接访问列表的第一个元素
front_element = queue[0]print("队首元素:", front_element)# 输出: 队首元素: b- 检查队列是否为空
is_empty =len(queue)==0print("队列是否为空:", is_empty)# 输出: 队列是否为空: False- 获取队列大小
size =len(queue)print("队列大小:", size)# 输出: 队列大小: 2也可以封装一个 Queue 类:
classQueue:def__init__(self): self.queue =[]defenqueue(self, item): self.queue.append(item)defdequeue(self):ifnot self.is_empty():return self.queue.pop(0)else:raise IndexError("dequeue from empty queue")defpeek(self):ifnot self.is_empty():return self.queue[0]else:raise IndexError("peek from empty queue")defis_empty(self):returnlen(self.queue)==0defsize(self):returnlen(self.queue)# 使用示例 queue = Queue() queue.enqueue('a') queue.enqueue('b') queue.enqueue('c')print("队首元素:", queue.peek())# 输出: 队首元素: aprint("队列大小:", queue.size())# 输出: 队列大小: 3print("移除的元素:", queue.dequeue())# 输出: 移除的元素: aprint("队列是否为空:", queue.is_empty())# 输出: 队列是否为空: Falseprint("队列大小:", queue.size())# 输出: 队列大小: 2列表推导式
列表推导式提供了从序列创建列表的简单途径。它的基本形式是在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句,返回结果是一个根据表达式从其后的 for 和 if 上下文环境中生成出来的列表。
列表推导式示例
- 将列表中每个数值乘三
vec =[2,4,6]print([3*x for x in vec])# 输出: [6, 12, 18]- 生成包含元素及其平方的列表
vec =[2,4,6]print([[x, x**2]for x in vec])# 输出: [[2, 4], [4, 16], [6, 36]]- 对序列里每一个元素调用 strip() 方法
freshfruit =[' banana',' loganberry ','passion fruit ']print([weapon.strip()for weapon in freshfruit])# 输出: ['banana', 'loganberry', 'passion fruit']- 使用 if 子句作为过滤器
vec =[2,4,6]print([3*x for x in vec if x >3])# 输出: [12, 18]print([3*x for x in vec if x <2])# 输出: []- 多重循环操作
vec1 =[2,4,6] vec2 =[4,3,-9]print([x*y for x in vec1 for y in vec2])# 输出: [8, 6, -18, 16, 12, -36, 24, 18, -54]print([x+y for x in vec1 for y in vec2])# 输出: [6, 5, -7, 8, 7, -5, 10, 9, -3]print([vec1[i]*vec2[i]for i inrange(len(vec1))])# 输出: [8, 12, -54]- 使用复杂表达式或嵌套函数
print([str(round(355/113, i))for i inrange(1,6)])# 输出: ['3.1', '3.14', '3.142', '3.1416', '3.14159']嵌套列表解析
Python 的列表可以嵌套,通过嵌套列表解析可以对嵌套列表进行处理。
例如,将 3X4 的矩阵列表转换为 4X3 列表:
matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12],]print([[row[i]for row in matrix]for i inrange(4)])# 输出: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]也可以使用以下方法实现:
transposed =[]for i inrange(4): transposed.append([row[i]for row in matrix])print(transposed)# 输出: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]或者:
transposed =[]for i inrange(4): transposed_row =[]for row in matrix: transposed_row.append(row[i]) transposed.append(transposed_row)print(transposed)# 输出: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]del 语句
使用 del 语句可以从一个列表中根据索引来删除一个元素、删除一个切割或清空整个列表,也可以删除实体变量。
a =[-1,1,66.25,333,333,1234.5]del a[0]print(a)# 输出: [1, 66.25, 333, 333, 1234.5]del a[2:4]print(a)# 输出: [1, 66.25, 1234.5]del a[:]print(a)# 输出: []del a # 删除变量 a二、元组和序列
元组由若干逗号分隔的值组成,它是不可变的。
t =12345,54321,'hello!'print(t[0])# 输出: 12345print(t)# 输出: (12345, 54321, 'hello!')# 元组可以嵌套 u = t,(1,2,3,4,5)print(u)# 输出: ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号,不过括号通常是必须的(如果元组是更大的表达式的一部分)。
三、集合
集合是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素。
可以用大括号({})创建集合。注意:如果要创建一个空集合,必须用 set() 而不是 {},后者创建一个空的字典。
集合的基本操作
basket ={'apple','orange','apple','pear','orange','banana'}print(basket)# 输出: {'orange', 'banana', 'pear', 'apple'}(删除重复元素)print('orange'in basket)# 输出: True(检测成员)print('crabgrass'in basket)# 输出: False a =set('abracadabra') b =set('alacazam')print(a)# 输出: {'a', 'r', 'b', 'c', 'd'}(a 中唯一的字母)print(a - b)# 输出: {'r', 'd', 'b'}(在 a 中的字母,但不在 b 中)print(a | b)# 输出: {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}(在 a 或 b 中的字母)print(a & b)# 输出: {'a', 'c'}(在 a 和 b 中都有的字母)print(a ^ b)# 输出: {'r', 'd', 'b', 'm', 'z', 'l'}(在 a 或 b 中的字母,但不同时在 a 和 b 中)集合推导式
a ={x for x in'abracadabra'if x notin'abc'}print(a)# 输出: {'r', 'd'}四、字典(Dictionary)
字典是 Python 中另一种非常重要的数据结构,它与序列不同,序列以连续的整数为索引,而字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。
字典可以看作是无序的键值对集合,在同一个字典中,关键字必须互不相同。一对大括号{}可以创建一个空字典。
字典的基本操作
# 创建并初始化字典 tel ={'jack':4098,'sape':4139}# 新增键值对 tel['guido']=4127print(tel)# 输出: {'sape': 4139, 'guido': 4127, 'jack': 4098}# 获取指定键的值print(tel['jack'])# 输出: 4098# 删除键值对del tel['sape']# 再次新增键值对 tel['irv']=4127print(tel)# 输出: {'guido': 4127, 'irv': 4127, 'jack': 4098}# 获取所有键并转为列表print(list(tel.keys()))# 输出: ['irv', 'guido', 'jack']# 对键进行排序print(sorted(tel.keys()))# 输出: ['guido', 'irv', 'jack']# 检查键是否在字典中print('guido'in tel)# 输出: Trueprint('jack'notin tel)# 输出: False字典的构造方式
- 使用构造函数
dict()从键值对元组列表构建字典
print(dict([('sape',4139),('guido',4127),('jack',4098)]))# 输出: {'sape': 4139, 'jack': 4098, 'guido': 4127}- 使用字典推导式创建字典
print({x: x**2for x in(2,4,6)})# 输出: {2: 4, 4: 16, 6: 36}- 当关键字是简单字符串时,使用关键字参数指定键值对更方便
print(dict(sape=4139, guido=4127, jack=4098))# 输出: {'sape': 4139, 'jack': 4098, 'guido': 4127}五、遍历技巧
在处理各种数据结构时,掌握有效的遍历技巧能提高编程效率。
遍历字典
在字典中遍历时,可使用items()方法同时获取关键字和对应的值:
knights ={'gallahad':'the pure','robin':'the brave'}for k, v in knights.items():print(k, v)# 输出:# gallahad the pure# robin the brave遍历序列
在序列中遍历时,enumerate()函数可同时获取索引位置和对应值:
for i, v inenumerate(['tic','tac','toe']):print(i, v)# 输出:# 0 tic# 1 tac# 2 toe同时遍历多个序列
使用zip()函数可以组合多个序列,实现同时遍历:
questions =['name','quest','favorite color'] answers =['lancelot','the holy grail','blue']for q, a inzip(questions, answers):print('What is your {0}? It is {1}.'.format(q, a))# 输出:# What is your name? It is lancelot.# What is your quest? It is the holy grail.# What is your favorite color? It is blue.反向遍历序列
调用reversed()函数可以反向遍历一个序列:
for i inreversed(range(1,10,2)):print(i)# 输出:# 9# 7# 5# 3# 1按顺序遍历序列
使用sorted()函数可返回一个已排序的序列,且不修改原序列,从而实现按顺序遍历:
basket =['apple','orange','apple','pear','orange','banana']for f insorted(set(basket)):print(f)# 输出:# apple# banana# orange# pear总结
本文详细介绍了 Python3 中常用的数据结构,包括列表、元组、集合、字典等。列表作为可变序列,提供了丰富的方法,可用于实现栈和队列;元组是不可变序列,适合存储不可修改的数据;集合能有效处理元素去重和关系测试;字典则以键值对的形式存储数据,便于快速查找。
同时,文中还介绍了各种数据结构的遍历技巧,掌握这些知识能帮助我们更灵活地处理数据,提高编程效率。希望本教程能为大家学习 Python 数据结构提供有力的帮助。
💡下一篇咱们学习 Python3 模块全面学习教程!
附录:扩展学习资源
- 官方资源:
- Python官网:https://www.python.org
- PyPI:https://pypi.org(查找第三方库)
- 安装包等相关文件(另附带pycharm工具),网盘下载地址:https://pan.quark.cn/s/649af731037c
- 学习资料视频和文档资源,网盘下载地址: https://pan.quark.cn/s/ee16901a8954
- 本专栏特色资源:
- 代码资源仓库:ZEEKLOG专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”)
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于ZEEKLOG平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。
📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌