Python 序列详解
索引、切片与常用操作一网打尽
学完了字符串,你其实已经接触过一种序列了。Python 里的序列不止字符串,还有列表、元组等,它们共享一套操作方式——索引、切片、相加、相乘、成员判断……今天就把这些通用操作一次性讲透,后面学列表和元组就轻松了。
想象你有一排储物柜,每个柜子都有编号,从 0 开始往后排。你想知道第 5 个柜子里放了什么,直接报编号就行——这大概就是 Python 序列最直观的模样。
序列(Sequence)就是一种「按顺序排列的数据集合」。字符串是字符的序列,列表是元素的序列,元组也是序列。它们内部存放数据的方式都差不多,所以学会了一套操作,就能用在所有序列类型上。
💡 小贴士
理解了序列的通用操作,后面学列表、元组就是换了个数据类型,操作都一样,省时又省力!
储物柜有编号,序列里的元素也有编号。在 Python 中,这个编号叫做索引(Index)。
正向索引:从 0 开始
正向索引从 0 开始数,第一个元素索引是 0,第二个是 1,以此类推。这点是很多新手容易搞混的地方——一定要记住,Python 从 0 开始计数,不是从 1。
负向索引:从 -1 开始
Python 还支持负数索引,-1 表示倒数第一个元素,-2 表示倒数第二个,依此类推。负向索引从 -1 开始,往左依次递减。
fruits = ['苹果', '香蕉', '橘子', '葡萄', '西瓜']# 正向索引print(fruits[0]) # 苹果print(fruits[4]) # 西瓜# 负向索引print(fruits[-1]) # 西瓜print(fruits[-5]) # 苹果
💡 小贴士
负索引特别适合取末尾元素,不用先算长度。fruits[-1] 永远是最后一个,比 fruits[len(fruits)-1] 简洁多了!
如果索引是找单个柜子,那切片就是一次打开一段相邻的柜子。就像看视频时拖动进度条,截取其中一段内容。
基本语法
切片的写法是 序列[起始:结束:步长],三个参数都是可选的:
start:起始位置(默认为 0)
end:结束位置(默认为序列末尾)
step:步长(默认为 1,步长为 -1 时可以反转序列)
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 取前3个print(nums[:3]) # [0, 1, 2]# 从第3个取到末尾print(nums[3:]) # [3, 4, 5, 6, 7, 8, 9]# 完整复制print(nums[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 隔一个取一个(步长为2)print(nums[::2]) # [0, 2, 4, 6, 8]# 反转print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
💡 小贴士
切片是左闭右开,nums[2:5] 取的是第2、3、4个元素,不包含第5个,这是最常踩的坑!
💡 小贴士
nums[:] 是复制序列的常用写法,新列表和原列表互不影响,在处理数据时特别有用!
同类型的序列可以用 + 拼在一起,就像把两排储物柜连起来,组成一排更长的柜子。
morning = ['早起', '跑步']evening = ['看书', '睡觉']print(morning + evening)# ['早起', '跑步', '看书', '睡觉']
⚠️ 注意
不同类型的序列不能相加!列表 + 字符串会报错,需要先转换类型。比如把数字转成字符串,或者用 join() 方法来处理。
用序列乘以一个数字 n,就相当于把这个序列重复 n 次。这在初始化列表时特别有用。
cheer = '加油!'print(cheer * 3)# 加油!加油!加油!# 初始化一个长度为5的列表empty = [0] * 5print(empty)# [0, 0, 0, 0, 0]
💡 小贴士
[0] * n 是初始化固定长度列表的常用技巧,但注意嵌套列表要用列表推导式,不然会踩引用的坑!
想知道某个元素在不在序列里?用 in 和 not in 来判断,会返回布尔值 True 或 False。
menu = ['宫保鸡丁', '鱼香肉丝', '麻婆豆腐']print('鱼香肉丝' in menu) # Trueprint('红烧肉' in menu) # Falseprint('红烧肉' not in menu) # True
💡 小贴士
in 判断在条件语句里特别好用,比如 if item in shopping_list: 比 if shopping_list.count(item) > 0: 简洁得多!
Python 内置了一些直接操作序列的函数,不用导入任何模块,拿来就能用。下面这张表整理了最常用的几个:
| | |
|---|
len() | | len([1,2,3]) → 3 |
max() | | max([3,1,2]) → 3 |
min() | | min([3,1,2]) → 1 |
sum() | | sum([1,2,3]) → 6 |
sorted() | | sorted([3,1,2]) → [1,2,3] |
list() | | list('abc') → ['a','b','c'] |
str() | | str([1,2]) → '[1, 2]' |
enumerate() | | |
综合示例
scores = [88, 72, 95, 60, 79]print('人数:', len(scores)) # 5print('最高分:', max(scores)) # 95print('最低分:', min(scores)) # 60print('平均分:', sum(scores) / len(scores)) # 78.8print('排名:', sorted(scores, reverse=True)) # [95, 88, 79, 72, 60]# enumerate 在循环中特别好用for index, score in enumerate(scores): print(f'第{index+1}位同学:{score}分')
💡 小贴士
sorted() 返回的是新列表,不会修改原序列。如果想原地排序,用列表的 sort() 方法。
💡 小贴士
enumerate() 是 Python 的宝藏函数,遍历时同时拿到索引和值,告别 range(len()) 的丑写法!
序列的这些操作是列表、元组、字符串的通用技能,掌握之后学具体类型就只剩记差异了。下一篇我们就来聊列表——Python 里最灵活的数据结构,记得关注!