Python序列(列表list和元组tuple)用法完全攻略
所谓序列,指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员。
Python 的常见序列类型包括字符串、列表和元组。前一章介绍过的字符串,其实就是一种常见的序列,通过索引访问字符串内的字符程序就是序列的示范程序。
本节介绍的序列主要是指列表和元组,这两种类型看起来非常相似,最主要的区别在于:元组是不可变的,元组一旦构建出来,程序就不能修改元组所包含的成员(就像字符串也是不可变的,程序无法修改字符串所包含的字符序列);但列表是可变的,程序可以修改列表所包含的元素。
在具体的编程过程中,如果只是固定地保存多个数据项,则不需要修改它们,此时就应该使用元组;反之,就应该使用列表。此外,在某些时候,程序需要使用不可变的对象,比如 Python 要求字典的 key 必须是不可变的,此时程序就只能使用元组。
创建列表的语法格式如下:
step 表示步长,因此 step 使用负数没有意义。
下面代码示范了使用 start、end 获取元组中间一段的用法:
需要指出的是,列表只能和列表相加;元组只能和元组相加;元组不能直接和列表相加。
如下代码示范了元组和列表的加法运算:
如下代码示范了列表和元组的乘法:
为此,可使用如下代码来完成该转换:
由于 max()、min() 要对元组、列表中的元素比较大小,因此程序要求传给 max()、min() 函数的元组、列表的元素必须是相同类型且可以比较大小。例如如下代码:
下面代码示范了序列封包和序列解包的功能:
Python 的常见序列类型包括字符串、列表和元组。前一章介绍过的字符串,其实就是一种常见的序列,通过索引访问字符串内的字符程序就是序列的示范程序。
本节介绍的序列主要是指列表和元组,这两种类型看起来非常相似,最主要的区别在于:元组是不可变的,元组一旦构建出来,程序就不能修改元组所包含的成员(就像字符串也是不可变的,程序无法修改字符串所包含的字符序列);但列表是可变的,程序可以修改列表所包含的元素。
在具体的编程过程中,如果只是固定地保存多个数据项,则不需要修改它们,此时就应该使用元组;反之,就应该使用列表。此外,在某些时候,程序需要使用不可变的对象,比如 Python 要求字典的 key 必须是不可变的,此时程序就只能使用元组。
简单讲,列表和元组的关系就是可变和不可变的关系。
创建列表和元组
创建列表和元组的语法也有点相似,区别只是创建列表使用方括号,创建元组使用圆括号,并在括号中列出元组的元素,元素之间以英文逗号隔开。创建列表的语法格式如下:
[ele1,ele2,ele3,...]
创建元组的语法格式如下:(ele1,ele2,ele3,...)
下面代码示范了在程序中定义列表和元组:a_tuple = ('crazyit', 20, 5.6, 'fkit', -17) print(a_tuple) # 访问第1个元素 print(a_tuple[0]) # crazyit # 访问第2个元素 print(a_tuple[1]) # 20 # 访问倒数第1个元素 print(a_tuple[-1]) # -17 # 访问倒数第2个元素 print(a_tuple[-2]) # -fkit
列表和元组切片
与前面介绍的字符串操作类似的是,列表和元组同样也可使用索引获取中间一段,这种用法被称为 slice(分片或切片)。slice 的完整语法格式如下:[start : end : step]
上面语法中 start、end 两个索引值都可使用正数或负数,其中负数表示从倒数开始。该语法表示从 start 索引的元素开始(包含),到 end 索引的元素结束(不包含)的所有元素,这和所有编程语言的约定类似。step 表示步长,因此 step 使用负数没有意义。
下面代码示范了使用 start、end 获取元组中间一段的用法:
a_tuple = ('crazyit', 20, 5.6, 'fkit', -17) # 访问从第2个到倒数第4个(不包含)所有元素 print(a_tuple[1: 3]) # (20, 5.6) # 访问从倒数第3个到倒数第1个(不包含)所有元素 print(a_tuple[-3: -1]) # (5.6, 'fkit') # 访问从第2个到倒数第2个(不包含)所有元素 print(a_tuple[1: -2]) # (20, 5.6) # 访问从倒数第3个到第5个(不包含)所有元素 print(a_tuple[-3: 4]) # (5.6, 'fkit')如果指定 step 参数,则可间隔 step 个元素再取元素。例如如下代码:
b_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9) # 访问从第3个到第9个(不包含)、间隔为2的所有元素 print(b_tuple[2: 8: 2]) # (3, 5, 7) # 访问从第3个到第9个(不包含)、间隔为3的所有元素 print(b_tuple[2: 8: 3]) # (3, 6) # 访问从第3个到倒数第2个(不包含)、间隔为3的所有元素 print(b_tuple[2: -2: 2]) # (3, 5, 7)
加法
列表和元组支持加法运算,加法的和就是两个列表或元组所包含的元素的总和。需要指出的是,列表只能和列表相加;元组只能和元组相加;元组不能直接和列表相加。
如下代码示范了元组和列表的加法运算:
a_tuple = ('crazyit' , 20, -1.2) b_tuple = (127, 'crazyit', 'fkit', 3.33) # 计算元组相加 sum_tuple = a_tuple + b_tuple print(sum_tuple) # ('crazyit', 20, -1.2, 127, 'crazyit', 'fkit', 3.33) print(a_tuple) # a_tuple并没有改变 print(b_tuple) # b_tuple并没有改变 # 两个元组相加 print(a_tuple + (-20 , -30)) # ('crazyit', 20, -1.2, -20, -30) # 下面代码报错:元组和列表不能直接相加 #print(a_tuple + [-20 , -30]) a_list = [20, 30, 50, 100] b_list = ['a', 'b', 'c'] # 计算列表相加 sum_list = a_list + b_list print(sum_list) # [20, 30, 50, 100, 'a', 'b', 'c'] print(a_list + ['fkit']) # [20, 30, 50, 100, 'fkit']
乘法
列表和元组可以和整数执行乘法运算,列表和元组乘法的意义就是把它们包含的元素重复 N 次(N 就是被乘的倍数)。如下代码示范了列表和元组的乘法:
a_tuple = ('crazyit' , 20) # 执行乘法 mul_tuple = a_tuple * 3 print(mul_tuple) # ('crazyit', 20, 'crazyit', 20, 'crazyit', 20) a_list = [30, 'Python', 2] mul_list = a_list * 3 print(mul_list) # [30, 'Python', 2, 30, 'Python', 2, 30, 'Python', 2]当然,也可以对列表、元组同时进行加法、乘法运算。例如,把用户输入的日期翻译成英文表示形式,即添加英文的“第”后缀。对于 1、2、3 来说,英文的“第”后缀分别用 st、nd、rd 代表,其他则使用 th 代表。
为此,可使用如下代码来完成该转换:
# 同时对元组使用加法、乘法 order_endings = ('st', 'nd', 'rd')\ + ('th',) * 17 + ('st', 'nd', 'rd')\ + ('th',) * 7 + ('st',) # 将会看到st、nd、rd、17个th、st、nd、rd、7个th、st print(order_endings) day = input("输入日期(1-31):") # 将字符串转成整数 day_int = int(day) print(day + order_endings[day_int - 1])该程序中,同时对 ('th',) 元组使用了乘法,再将乘法得到的结果使用加法连接起来,最终得到一个元组,该元组共有 31 个元素。
可能有读者对 ('th',) 这种写法感到好奇,此处明明只有一个元素,为何不省略逗号?这是因为 ('th') 只是字符串加上圆括号,并不是元组,也就是说,('th') 和 'th' 是相同的。为了表示只有一个元素的元组,必须在唯一的元组元素之后添加英文逗号。
运行上面程序,可以看到如下运行结果:
输入日期(1-31):27
27th
in 运算符
in 运算符用于判断列表或元组是否包含某个元素,例如如下代码:a_tuple = ('crazyit' , 20, -1.2) print(20 in a_tuple) # True print(1.2 in a_tuple) # False print('fkit' not in a_tuple) # True
长度、最大值和最小值
Python 提供了内置的 ten()、max()、min() 全局函数来获取元组或列表的长度、最大值和最小值。由于 max()、min() 要对元组、列表中的元素比较大小,因此程序要求传给 max()、min() 函数的元组、列表的元素必须是相同类型且可以比较大小。例如如下代码:
# 元素都是数值的元组 a_tuple = (20, 10, -2, 15.2, 102, 50) # 计算最大值 print(max(a_tuple)) # 102 # 计算最小值 print(min(a_tuple)) # -2 # 计算长度 print(len(a_tuple)) # 6 # 元素都是字符串的列表 b_list = ['crazyit', 'fkit', 'Python', 'Kotlin'] # 计算最大值(依次比较每个字符的ASCII码值,先比较第一个字符,若相同,继续比较第二个字符,以此类推) print(max(b_list)) # fkit(26个小写字母的ASCII码为97~122) # 计算最小值 print(min(b_list)) # Kotlin (26个大写字母的ASCII码为65~90) # 计算长度 print(len(b_list)) # 4在上面代码中,首先使用 3 个函数对元素都是数值的元组进行处理,可以看到程序获取元组的最大值、最小值等。程序后半部分使用 3 个函数对元素都是宇符串的列表进行处理,也可以看到程序获取列表的最大值、最小值等,这说明 Python 的字符串也是可比较大小的,即 Python 依次按字符串中每个字符对应的编码来比较字符串的大小。
序列封包和序列解包
Python 还提供了序列封包(Sequence Packing)和序列解包(Sequence Unpacking)的功能。简单来说,Python 允许支持以下两种赋值方式:- 程序把多个值赋给一个变量时,Python 会自动将多个值封装成元组。这种功能被称为序列封包。
- 程序允许将序列(元组或列表等)直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等)。这种功能被称为序列解包。
下面代码示范了序列封包和序列解包的功能:
# 序列封包:将10、20、30封装成元组后赋值给vals vals = 10, 20, 30 print(vals) # (10, 20, 30) print(type(vals)) # <class 'tuple'> print(vals[1]) # 20 a_tuple = tuple(range(1, 10, 2)) # 序列解包: 将a_tuple元组的各元素依次赋值给a、b、c、d、e变量 a, b, c, d, e = a_tuple print(a, b, c, d, e) # 1 3 5 7 9 a_list = ['fkit', 'crazyit'] # 序列解包: 将a_list序列的各元素依次赋值给a_str、b_str变量 a_str, b_str = a_list print(a_str, b_str) # fkit crazyit如果在赋值中同时运用了序列封包和序列解包机制,就可以让赋值运算符支持同时将多个值赋给多个变量。例如如下代码:
# 将10、20、30依次赋值给x、y、z x, y, z = 10, 20, 30 print(x, y, z) # 10 20 30上面代码实际上相当于如下执行过程:
#先执行序列封包 xyz = 10,20,30 #再执行序列解包 x,y,z = xyz使用这种语法也可以实现交换变量的值,例如如下代码:
# 将y,z, x依次赋值给x、y、z x, y, z = y, z, x print(x, y, z) # 20 30 10在序列解包时也可以只解出部分变量,剩下的依然使用列表变量保存。为了使用这种解包方式,Python 允许在左边被赋值的变量之前添加“*”,那么该变量就代表一个列表,可以保存多个集合元素。例如如下程序:
# first、second保存前2个元素,rest列表包含剩下的元素 first, second, *rest = range(10) print(first) # 0 print(second) # 1 print(rest) # [2, 3, 4, 5, 6, 7, 8, 9] # last保存最后一个元素,begin保存前面剩下的元素 *begin, last = range(10) print(begin) # [0, 1, 2, 3, 4, 5, 6, 7, 8] print(last) # 9 # first保存第一个元素,last保存最后一个元素,middle保存中间剩下的元素 first, *middle, last = range(10) print(first) # 0 print(middle) # [0, 1, 2, 3, 4, 5, 6, 7, 8] print(last) # 9
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算