写在前面
在编程中,我们经常需要处理一堆数据——比如一个班的成绩、一周的温度、购物车的商品……
如果每个数据都用一个变量存,那得写多少变量?30个学生就要写30个变量?这显然不合理。
Python给了我们一个解决方案:序列(Sequence)。
你可以把序列理解成一个带编号的收纳箱,每个格子都有编号(索引),可以按编号存取东西。
一、认识序列
1.1 序列有哪些?
Python中最常用的序列类型:
| | |
|---|
| 列表(list) | | [1, 2, 3] |
| 元组(tuple) | | (1, 2, 3) |
| 字符串(str) | | "hello" |
💡 一句话理解:序列就是"有顺序的一排数据",每个数据都有自己固定的位置编号。
1.2 索引:数据的"门牌号"
序列中每个元素的位置编号叫做索引,从 0 开始:
字符串 "helloCoCo"正向索引: h e l l o C o C o 0 1 2 3 4 5 6 7 8负向索引: -9 -8 -7 -6 -5 -4 -3 -2 -1
s = "helloCoCo"print(s[0]) # h,第一个元素print(s[-1]) # o,最后一个元素print(s[100]) # 报错!IndexError: string index out of range
⚠️ 注意:
1.3 切片:批量取数据
切片是从序列中"截取一段",语法是 s[起始:结束]:
s = "helloCoCo"print(s[:2]) # he,从开头取到索引2(不包含2)print(s[2:]) # lloCoCo,从索引2取到末尾print(s[2:5]) # llo,从索引2取到索引5(不包含5)print(s[-3:]) # CoCo,取最后3个print(s[::2]) # hlooC,每隔一个取一个
💡 记忆技巧:s[起始:结束:步长],结束位置取不到,就像排队说"到5号为止"意思是排到4号。
二、序列通用操作
2.1 遍历序列
for循环遍历(推荐):
s = "helloCoCo"for val in s: print(val)# 输出:h e l l o C o C o(每个字符一行)
s = "helloCoCo"i = 0while i < len(s): print(s[i]) i += 1
2.2 序列运算符
# 比较运算符(按字典序逐个比较)print([1, 2, 3] < [1, 2, 4]) # True# not 判断是否为空print(not []) # True,空列表被视为Falseprint(not [1]) # False# 加法(拼接)print([1, 2] + [3, 4]) # [1, 2, 3, 4]print("hello" + "world") # helloworld# 乘法(重复)print([1] * 3) # [1, 1, 1]print("ha" * 3) # hahaha
2.3 常用序列函数
| | |
|---|
len() | | len("hello") |
max() | | max([3, 1, 2]) |
min() | | min([3, 1, 2]) |
sum() | | sum([1, 2, 3]) |
in | | 3 in [1, 2, 3] |
sorted() | | sorted([3,1,2]) |
all() | | all([1, 2, 0]) |
any() | | any([0, 0, 1]) |
zip() | | list(zip([1,2],[3,4])) |
2.4 理解 key 参数
max() 和 min() 的 key 参数非常实用:
vals = [1, -10, 3, -11, 8, -3]# 直接取最大值print(max(vals)) # 8# 取绝对值最大的值print(max(vals, key=abs)) # -11# 在字符串列表中,按数字大小取最大值listnum = ['200', '798', '1000']print(max(listnum, key=int)) # '1000'
key 的工作原理:
- 返回的是原始元素
三、列表:最强大的"收纳箱"
3.1 什么是列表?
列表是 Python 中最常用的数据结构,你可以把它理解为一个可以随时增删改的盒子:
# 列表可以存放任何类型的数据l = [1, "hello", 3.14, True, None]print(l) # [1, 'hello', 3.14, True, None]# 甚至可以放列表(二维列表)matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3.2 创建列表
# 方式1:直接定义list1 = [1, '1', '2', 3]# 方式2:使用 list() 函数s = "qimao"tmp = list(s)print(tmp) # ['q', 'i', 'm', 'a', 'o']# 字符串列表转回字符串print("".join(tmp)) # 'qimao'
3.3 遍历二维列表
scores = ["class_1", ["sun", 80, 60], ["zhao", 70, 90]]for item in scores: if isinstance(item, list): # 判断是不是列表 for val in item: print(val) else: print(item)# 输出:# class_1# sun# 80# 60# zhao# 70# 90
3.4 修改列表元素
列表是可变的,可以直接修改某个位置的值:
scores = [60, 90, 59]scores[1] = 62print(scores) # [60, 62, 59]
a = [96, 80, -1, 66]for index, val in enumerate(a): if val == -1: a[index] = 0print(a) # [96, 80, 0, 66]
💡 enumerate() 函数:同时获取索引和值,比手动维护索引变量方便得多。
四、列表增删改查
4.1 添加元素
l = [1, 2, 3]# append:尾部添加一个元素l.append(4)print(l) # [1, 2, 3, 4]# insert:在指定位置插入l.insert(0, -1)print(l) # [-1, 1, 2, 3, 4]# extend:尾部添加多个元素l.extend([5, 6])print(l) # [-1, 1, 2, 3, 4, 5, 6]# 也可以 extend 字符串(会把字符串拆成单个字符)l.extend("789")print(l) # [-1, 1, 2, 3, 4, 5, 6, '7', '8', '9']
4.2 统计与查找
l = [1, 2, 3, 4, 3, 5, 3]# count:统计出现次数print(l.count(3)) # 3,出现了3次# index:查找第一次出现的位置print(l.index(3)) # 2,第一次出现在索引2# index 也可以指定搜索范围print(l.index(3, 3)) # 4,从索引3之后找,第一次出现在4
4.3 删除元素
l = [1, 4, 2, 4, 3, 4]# pop:删除指定位置的元素,并返回该元素l.pop() # 删除最后一个,返回4print(l) # [1, 4, 2, 4, 3]l.pop(0) # 删除第一个,返回1print(l) # [4, 2, 4, 3]# remove:删除第一个匹配的值l.remove(4) # 删除第一个4print(l) # [2, 4, 3]# clear:清空列表l.clear()print(l) # []
4.4 ⚠️ 列表删除的"陷阱"
问题:遍历时删除元素,可能会遗漏!
vals = [1, 2, 3, 4, 4, 5, 4, 5, 6]# ❌ 错误写法:删除时列表在变化,会跳过某些元素for val in vals: if vals.count(val) > 1: vals.remove(val)print(vals) # [1, 2, 3, 4, 4, 5, 6] —— 没删干净!
vals = [1, 2, 1, 2, 3, 4, 4, 5, 4, 5, 6]# ✅ 正确写法:用 while 循环反复去重while True: for item in vals: if vals.count(item) > 1: vals.remove(item) break else: break # for循环没被break中断,说明没有重复了print(vals) # [1, 2, 3, 4, 5, 6]
⚠️ 核心教训:在遍历列表时不要直接删除元素,这会导致索引错位。推荐用列表解析或创建新列表的方式处理。
五、元组:不可变的"收纳箱"
5.1 什么是元组?
元组和列表很像,但有一个关键区别:元组不可变。
# 创建元组t1 = (1, 2, 3)t2 = 1, 2, 3 # 省略括号也可以t3 = tuple("1234") # ('1', '2', '3', '4')t4 = tuple([1,2,3,4]) # (1, 2, 3, 4)# 元组解包赋值a, b, c = (1, 2, 3)print(a, b, c) # 1 2 3
5.2 为什么需要元组?
t = (1, 2, 3)t[0] = -1 # 报错!TypeError: 'tuple' object does not support item assignment
💡 简单理解:如果你确定数据不会被修改,就用元组,它比列表更安全、更快。
5.3 元组常用方法
元组只有两个方法(因为不能修改嘛):
t = (1, 2, 3, 2, 2)print(t.count(2)) # 3,2出现了3次print(t.index(3)) # 2,3第一次出现在索引2
六、列表解析:Python的"魔法语法"
6.1 什么是列表解析?
列表解析是 Python 中创建列表的简洁写法,一行代码就能完成多行循环的工作。
基本语法:
6.2 基础用法
# 生成 [1, 2, 3, 4, 5]print([val for val in range(1, 6)])# 生成 [1, 4, 9, 16, 25](每个数的平方)print([val ** 2 for val in range(1, 6)])# 生成 ['0', '1', '2', '3', '4', '5'](数字转字符串)print([str(val) for val in range(0, 6)])# 520 → [5, 2, 0]print([int(val) for val in str(520)])# 生成10个随机数import randomprint([random.randint(1, 100) for i in range(10)])
💡 对比一下:用传统循环要写4行,列表解析只需1行,简洁又优雅!
6.3 带条件的列表解析
语法:
[表达式 for 变量 in 可迭代对象 if 条件]
# 1~100之间的偶数evens = [val for val in range(1, 101) if val % 2 == 0]print(evens) # [2, 4, 6, 8, ..., 100]# 过滤及格的成绩scores = [59, 100, 20, 30, 80]passed = [score for score in scores if score >= 60]print(passed) # [100, 80]# 统计每段歌词中每个单词的长度lyrics = """When I was young I'd listen to the radioWaiting for my favorite songsWhen they played I'd sing along,It made me smile."""word_len = [len(word) for word in lyrics.split()]print(word_len) # [4, 1, 3, 5, 3, 6, 2, 3, 5, ...]print(sum(word_len)) # 98,总字符数
6.4 多重循环的列表解析
语法:
[表达式 for 变量1 in 序列1 for 变量2 in 序列2]
# 两个列表的两两组合result = [(v1, v2) for v1 in range(1, 4) for v2 in range(1, 4)]print(result)# [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]# 两两乘积products = [v1 * v2 for v1 in range(1, 4) for v2 in range(1, 4)]print(products) # [1, 2, 3, 2, 4, 6, 3, 6, 9]
6.5 用列表解析写乘法口诀表
result = [f"{j}*{i}={i*j}" for i in range(1, 10) for j in range(1, 10) if i >= j]print(result)# ['1*1=1', '1*2=2', '2*2=4', '1*3=3', '2*3=6', '3*3=9', ...]
💡 这行代码就生成了完整的乘法口诀表!i >= j 确保了不重复(比如只有2×3,没有3×2)。
七、实战练习
练习1:有序列表插入元素
在有序列表中插入数字,保持列表有序:
def insert_value(listnum): while True: val = input("输入数字(输入q退出):") if val == "q": break val = int(val) for index, item in enumerate(listnum): if val <= item: listnum.insert(index, val) break else: listnum.append(val) # 比所有元素都大,加到末尾 print(listnum)listn = [1, 2, 3]insert_value(listn)
练习2:数字转数字列表
def num_to_list(num): result = [] for value in str(num): result.append(int(value)) return resultprint(num_to_list(320)) # [3, 2, 0]print(num_to_list(9527)) # [9, 5, 2, 7]
练习3:合并两个有序列表
不用排序函数,手动合并两个有序列表:
八、知识总结
写在最后
列表是 Python 中最重要的数据结构,没有之一。
掌握列表,你就掌握了数据管理的基本能力。无论是处理成绩单、分析数据,还是开发应用,列表都是你的得力助手。
记住几个关键点:
下篇文章我们将学习字符串的更多用法。
觉得有用的话,点个赞👍,有问题欢迎评论区交流!
本文基于Python 3.8+编写,如有疑问欢迎交流讨论。