简明 Python 教程(第7章 数据结构)

本章将详细介绍Python中的三种主要内置数据结构:列表(list)、元组(tuple)和字典(dict)。这些数据结构是Python编程中处理数据集合的基础,它们提供了不同的方式来存储和操作数据。

列表(List)

列表(List)是Python中一种非常灵活且功能强大的数据结构,它是一个有序的元素集合,可以包含不同类型的元素。列表是可变的,这意味着你可以在列表创建后添加、删除或更改元素。以下是列表的一些主要特性和操作:

  • 创建列表

列表可以使用方括号[]来创建,或者使用list()构造函数:

# 使用方括号创建列表 
my_list = [1, 2, 3, 'a', 'b'] 
# 使用list()构造函数创建列表 
empty_list = list()
  • 访问列表元素

使用索引操作符[]来访问列表中的元素,索引从0开始:

# 访问第一个元素 
first_element = my_list[0] 
# 访问最后一个元素 
last_element = my_list[-1]
  • 修改列表元素

可以直接通过索引赋值来修改列表中的元素:

# 修改第二个元素 
my_list[1] = 'new value' 
# 打印修改后的列表 
print(my_list) 
# 输出: [1, 'new value', 3, 'a', 'b']
  • 添加元素到列表

列表提供了多种方法来添加元素:

  1. append():在列表末尾添加一个元素。
  2. extend():将一个序列中的所有元素添加到列表末尾。
  3. insert():在指定位置插入一个元素。
# 在列表末尾添加一个元素 
my_list.append('c') 
# 将另一个列表的元素添加到当前列表 
my_list.extend([4, 5]) 
# 在指定位置插入元素 
my_list.insert(2, 'inserted')
  • 删除列表元素

列表提供了几种删除元素的方法:

  1. remove():删除列表中第一个匹配的元素。
  2. pop():删除并返回指定位置的元素,如果不指定位置,则删除并返回最后一个元素。
  3. clear():删除列表中的所有元素。
  4. del:使用del语句删除列表的一部分或整个列表。
# 删除第一个出现的'a' 
my_list.remove('a') 
# 删除索引为2的元素 
del my_list[2] 
# 清空列表 
my_list.clear()
  • 列表切片

使用切片操作符[start:end:step]来获取列表的一部分:

# 获取前三个元素 
first_three = my_list[0:3] 
# 获取倒数第二个到最后一个元素 
last_two = my_list[-2:]
  • 遍历列表

使用for循环或in操作符来遍历列表中的所有元素:

# 使用for循环遍历 
for element in my_list: print(element) 
  • 列表推导式

首先介绍一下列表推导式,列表推导式(List Comprehension)是Python中一种优雅且简洁的构建列表的方法。它允许你通过一个表达式来创建一个新的列表,这个表达式会对另一个列表(或任何可迭代对象)中的每个元素执行操作,并将结果收集到一个新的列表中。

列表推导式基本语法

列表推导式的基本语法如下:

[expression for item in iterable if condition]

这里,expression是对item的操作或返回值,itemiterable中的元素,iterable可以是列表、元组、字符串等任何可迭代对象,condition是一个可选的条件语句,用于筛选满足条件的元素。

示例

假设我们有一个数字列表,我们想要创建一个新列表,其中包含原列表中所有偶数的平方:

original_list = [1, 2, 3, 4, 5, 6] 
squared_evens = [x**2 for x in original_list if x % 2 == 0] 
print(squared_evens) # 输出: [4, 16, 36]

在这个例子中,x**2是表达式,xoriginal_list中的每个元素,if x % 2 == 0是条件语句,用于筛选偶数。

多变量推导式

列表推导式还可以使用多个变量来遍历多个可迭代对象:

pairs = [(1, 'one'), (2, 'two'), (3, 'three')] 
pairs_with_index = [index + 1 for index, _ in pairs] 
print(pairsWith_index) # 输出: [2, 3, 4]

在这个例子中,我们使用了一个元组_作为占位符,因为我们只关心索引值。

嵌套推导式

列表推导式可以嵌套使用,例如,对每个元素应用多个操作:

original_list = [1, 2, 3, 4, 5, 6] 
nested_comprehension = [(x + 1) ** 2 for x in original_list if x % 2 == 0] 
print(nested_comprehension) # 输出: [25, 49, 81]
推导式与循环的等价性

列表推导式可以看作是for循环的简洁版本。上面的示例可以用传统的for循环重写如下:

squared_evens = [] 
for x in original_list: if x % 2 == 0: squared_evens.append(x**2) 
print(squared_evens) # 输出: [4, 16, 36]
注意事项
  1. 列表推导式在处理大型数据集时可能比传统的循环更高效,因为它们是优化过的。
  2. 过度复杂的推导式可能会降低代码的可读性,因此应该在简洁性和可读性之间找到平衡。
  3. 推导式中的if条件不能省略,如果你想要包含所有元素,可以在条件中使用True

列表推导式是一种创建列表的简洁方式,它基于已有列表生成新列表:

# 计算列表中每个元素的平方 
squared_list = [x**2 for x in my_list]
  • 列表方法

列表还提供了其他有用的方法,如:

  1. sort():对列表进行排序。
  2. reverse():反转列表中的元素。
  3. count():计算某个元素在列表中出现的次数。
  4. index():返回列表中第一个匹配项的索引。

元组(Tuple)

元组(Tuple)是Python中的一种数据结构,它是一个不可变的序列,可以包含多个不同类型的元素。元组用圆括号()定义,并且一旦创建,其内容就不能被修改(即不可变)。这使得元组在某些情况下比列表(List)更安全,因为它们的内容不会被意外改变。

  • 创建元组

元组可以通过直接在圆括号中放置一系列用逗号分隔的值来创建:

my_tuple = (1, 2, 3, 'a', 'b') 
empty_tuple = ()
  • 访问元组元素

与列表类似,可以使用索引操作符[]来访问元组中的元素。索引从0开始,负数索引从-1开始,表示从元组的末尾开始计数。

# 访问第一个元素 
first_element = my_tuple[0] 
# 访问最后一个元素 
last_element = my_tuple[-1] 
# 使用切片访问元组的一部分 
slice_of_tuple = my_tuple[1:3] # 输出: (2, 3)
  • 元组解包

Python允许你将元组中的值解包到多个变量中:

a, b, c = my_tuple 
# a = 1, b = 2, c = 3
  • 不可变性

由于元组是不可变的,你不能修改、添加或删除元组中的元素。尝试这样做将会导致TypeError

# 尝试修改元组中的元素将导致错误 
my_tuple[0] = 10 # TypeError: 'tuple' object does not support item assignment
  • 元组与列表的区别

  1. 可变性:列表是可变的,而元组是不可变的。
  2. 语法:列表使用方括号[],元组使用圆括号()。在创建空列表时,方括号是可选的,但在创建空元组时,圆括号是必须的。
  3. 性能:由于元组的不可变性,它们通常在性能上比列表更优,尤其是在作为字典的键时。
  4. 安全性:元组的不可变性提供了数据安全性,确保元组中的数据不会被更改。
  • 元组推导式

与列表推导式类似,元组推导式允许你创建一个元组:

my_tuple = (x**2 for x in range(10))

字典(Dict) 

字典(Dictionary)是Python中的一种内置数据结构,它存储键值对(key-value pairs)。字典中的键必须是不可变类型,通常是字符串或元组,而值可以是任何数据类型。字典是可变的,这意味着你可以在创建后添加、删除或更改键值对。字典提供了快速的数据检索、添加和更新的能力。

  • 创建字典

字典可以通过花括号{}dict()构造函数创建:

# 使用花括号创建字典 
my_dict = {'name': 'Alice', 'age': 25} 
# 使用dict()构造函数创建空字典 
empty_dict = dict()
  • 访问字典元素

使用键来访问字典中的值,操作符也是[]

# 访问键'name'对应的值 
name = my_dict['name'] 
# 如果键不存在,会抛出KeyError 
age = my_dict['age']

为了避免KeyError,可以使用get()方法,它允许你为不存在的键指定一个默认返回值:

# 使用get()方法,如果键不存在,返回'Unknown' 
occupation = my_dict.get('occupation', 'Unknown')
  • 添加和修改字典元素

可以通过直接赋值来添加新的键值对或修改现有的键值对:

# 添加新的键值对 
my_dict['email'] = 'alice@example.com' 
# 修改已有的键对应的值 
my_dict['age'] = 26
  • 删除字典元素

使用del语句删除字典中的键值对:

# 删除键'email'对应的项 
del my_dict['email']

也可以使用pop()方法删除一个键值对,并返回被删除的值:

# 删除键'age'对应的项,并返回它的值 
removed_age = my_dict.pop('age', None) 
# 返回None,因为'age'不存在
  • 遍历字典

可以使用循环来遍历字典中的键、值或键值对:

# 遍历字典的键 
for key in my_dict: print(key) 
# 遍历字典的值 
for value in my_dict.values(): print(value) 
# 遍历字典的键值对 
for key, value in my_dict.items():print(key, value)
  • 字典方法

字典提供了多种方法来操作字典:

  1. clear():删除字典中的所有项。
  2. copy():返回字典的浅拷贝。
  3. update():将一个字典的键值对更新到当前字典中。
  4. keys():返回字典中所有键的视图。
  5. values():返回字典中所有值的视图。
  6. items():返回字典中所有键值对的视图。
  • 字典推导式

字典推导式提供了一种创建字典的简洁方式:

# 创建一个字典,其中包含数字及其平方 
squares = {x: x**2 for x in range(10)}

序列操作 

序列操作是指在Python中对序列类型的数据结构(如列表、元组和字符串)执行的一系列操作。由于列表、元组和字符串在Python中都是序列,它们共享许多相似的方法和操作。以下是一些常见的序列操作:

  • 索引

序列中的每个元素都有一个索引,从0开始。你可以使用索引来访问序列中的特定元素。

sequence = [1, 2, 3, 'a', 'b'] 
print(sequence[0]) # 输出: 1 
print(sequence[-1]) # 输出: 'b' (最后一个元素)
  • 切片

切片操作允许你获取序列的一个子集。切片操作符[start:end:step]用于从序列中提取一段范围。

sequence = [1, 2, 3, 'a', 'b', 'c', 'd'] 
print(sequence[1:4]) # 输出: [2, 3, 'a'] 
print(sequence[:3]) # 输出: [1, 2, 3] 
print(sequence[2:]) # 输出: [3, 'a', 'b', 'c', 'd'] 
print(sequence[::2]) # 输出: [1, 'a', 'c'] (步长为2)
  • 连接

可以使用加号+来连接两个或多个序列。

list1 = [1, 2, 3] 
list2 = [4, 5, 6] 
combined = list1 + list2 
print(combined) # 输出: [1, 2, 3, 4, 5, 6]
  • 重复

可以使用星号*来重复序列多次。

repeated = [1, 2, 3] * 3 
print(repeated) # 输出: [1, 2, 3, 1, 2, 3, 1, 2, 3]
  • 遍历

可以使用for循环来遍历序列中的每个元素。

sequence = ['apple', 'banana', 'cherry'] 
for item in sequence: print(item)
  • 长度

使用内置的len()函数来获取序列的长度。

sequence = [1, 2, 3] 
print(len(sequence)) # 输出: 3
  • 成员检查

使用in操作符来检查一个元素是否存在于序列中。

sequence = [1, 2, 3] 
print(3 in sequence) # 输出: True 
print(4 in sequence) # 输出: False
  • 排序

列表可以使用sort()方法来就地排序,而sorted()函数可以返回一个新的排序后的序列。

list1 = [3, 1, 4, 1, 5, 9, 2, 6, 5] 
list1.sort() # 就地排序 
print(list1) # 输出: [1, 1, 2, 3, 4, 5, 5, 6, 9] 
sorted_list = sorted(list1) # 返回新的排序后的列表 
print(sorted_list) # 输出: [1, 1, 2, 3, 4, 5, 5, 6, 9]
  • 反转

列表可以使用reverse()方法来就地反转,或者使用切片操作来创建一个反转后的副本。

list1 = [1, 2, 3, 4, 5] 
list1.reverse() # 就地反转 
print(list1) # 输出: [5, 4, 3, 2, 1] 
reversed_list = list1[::-1] # 创建一个反转后的副本 
print(reversed_list) # 输出: [1, 2, 3, 4, 5]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据存储】TIDB和MySQL的区别

1.TIDB和MySQL对比 对比内容MySQLTiDB架构设计一个传统的单机数据库系统,采用主从复制和分区表等方式来实现水平扩展一个分布式的 NewSQL 数据库,采用分布式存储和分布式事务等技术,支持水平扩展和高可用性事务支持 InnoDB 存储引擎来支持事…

Python环境配置中的若干问题总结

bash: pip: command not found. curl https://bootstrap.pypa.io/get-pip.py > get.pip.py 如出现如下报错可根据提升更换下载链接:This script dose not work on Python2.7 The minimum supported Python version id 3.7. Please use https://bootstrap.pypa.…

【软考】系统可维护性的评价指标

目录 1. 可理解性2. 可测试性3.可修改性 1. 可理解性 1.指别人能理解系统的结构、界面、功能和内部过程的难易程度。模块化、详细设计文档、结构化设计和良好的高级程序设计语言等都有助于提高可理解性。 2. 可测试性 1.诊断和测试的容易程度取决于易理解的程度。2.好的文档…

LeetCode3. 无重复字符的最长子串(Java)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

监控NVIDIA GPU显卡占用状态的命令

一、使用nvidia-smi命令 NVIDIA 提供的用于管理和监控 NVIDIA GPU 设备的命令行工具,可查看当前系统中 NVIDIA GPU 的使用情况、温度、内存占用等信息。 [注]:Linux 和Windows都可支持此命令 nvidia-smi 二、使用nvitop命令 nvitop 是一个基于 NVIDIA …

面试算法-119-用栈实现队列

题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回…

【学习】软件测试中误区汇总分析

大家有没有想过这个问题:软件测试中有哪些误区呢?想起这个题目,是因为最近遇到好几次关于这方面的讨论。发觉即便做过几年测试的老员工也或多或少有些这方面的困惑。当然一家之言,仅作抛砖引玉之谈。 误区一:测试就是…

【Java程序设计】【C00364】基于Springboot的美发管理系统(有论文)

基于Springboot的美发管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及idea&…

【双指针】Leetcode 202.快乐数

题目解析 Leetcode 202.快乐数 看完题目描述相信大家已经知晓题目的含义,我们通过一张图再剖析一下题目含义 快乐数或者非快乐数都是可以成环的,这个是数学上已经证明了的。所以这道题的最后含义就是分辨出环中全部是1或者全部没有1的 双指针 成环问…

ETH 智能合约Gas文章整理

ETH - 智能合约&Gas文章整理 通过这些文章,可以了解ETH网络中Gas费的用途,种类以及交易优化 可以了解智能合约的Gas消耗 分类文章地址🥑ETH - Smart Contact智能合约 之 ERC-20🍆ETH - Smart Contact智能合约 之 部署ERC-20&a…

服务器基础知识(物理服务器云服务器)

今天我们来介绍一下服务器的基础知识 一、服务器硬件基础知识 组件说明中央处理器(CPU)CPU是服务器的大脑,负责执行计算任务和指令。服务器通常配备多个CPU核心,以支持并行处理和提高性能。关键的CPU性能指标包括时钟频率、核心数…

大数据毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 计算机毕业设计 机器学习 深度学习 人工智能 高考预测

意义 高考是中国的大学招生的学术资格考试,在目前看来,高考的考试类型有两种,一种是文理分科,另一种是新高考模式。传统的文理分科是将学生分成两个类型,一种是文科,除了语数外三门课以外需要学习政史地&am…

【Flask】用户身份认证

Flask 用户身份认证 项目代码见:GitHub - euansu123/FlaskMarket 前提条件 # flask-bcrypt 用户密码加密存储 pip install flask_bcrypt -i https://pypi.tuna.tsinghua.edu.cn/simple/ # flask提供的用户登录方法 pip install flask_login -i https://pypi.tuna…

notepad++使用小技巧

关于Notepad正则表达式匹配查找以xx开头以xx结尾包含特殊符号需转义的处理方法关于Notepad正则表达式匹配查找以xx开头以xx结尾包含特殊符号需转义的处理方法_notepad正则匹配开头和结尾-CSDN博客

Camtasia2024永久免费专业的屏幕录制和视频剪辑软件

Camtasia2024专业的屏幕录制和视频剪辑软件,3000多万专业人士在全球范围内使用Camtasia展示产品,教授课程,培训他人,以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得…

旺店通·企业版和金蝶云星空接口打通对接实战

旺店通企业版和金蝶云星空接口打通对接实战 ​​ ​​ 对接系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化…

android卡顿流程分析总结

一先说下基础流程: app端控制显示的常用方式是xml里面配置view布局,然后通过activity生命周期解析view到view对象里面,然后通过window的生命周期将这些对象传输到native层进行数据处理成图片,然后将这些图像数据传出到屏幕里面中去。 也就是说…

传输层介绍

目录 端到端与点到点 协议 与 规则 TCP协议 UDP协议 UDP和TCP的比较 TCP协议 报文段 TCP中数据的拆分和组装 怎么理解TCP面向字节流 流量控制与阻塞控制 三次握手和四次挥手 TCP中的重传 多路复用和分用 UDP协议 UDP协议中数据的拆分和组装 怎么理解UDP面向数据…

2024-2028年中国丙二醇乙醚(PE)市场行情监测及未来发展前景研究报告

丙二醇乙醚(PE)又称1-乙氧基-2-丙醇,化学式为C5H12O2,是一种有机化合物。丙二醇乙醚外观呈无色透明液体,微含醚气味,能与水和多数有机溶剂混溶,微溶于乙酸乙酯和氯仿。丙二醇乙醚具有吸湿性、挥…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…