Python列表与元组:有序序列的完整指南
列表和元组是Python中最常用的有序序列类型,本篇将系统讲解它们的用法、区别及实战场景。
一、列表(List)
列表是Python中最常用的数据结构,可以存储任意类型的元素,且支持增删改查。
1. 创建列表
# 空列表empty_list=[]empty_list2=list()# 有元素的列表numbers=[1,2,3,4,5]mixed=[1,"hello",3.14,True]# 可以混合不同类型nested=[[1,2],[3,4]]# 嵌套列表2. 访问元素(索引与切片)
fruits=["苹果","香蕉","橙子","葡萄","西瓜"]# 索引(从0开始)print(fruits[0])# 苹果print(fruits[-1])# 西瓜(负索引从末尾开始)# 切片 [起始:结束:步长]print(fruits[1:3])# ['香蕉', '橙子'](不包含结束索引)print(fruits[:3])# ['苹果', '香蕉', '橙子'](省略起始默认0)print(fruits[2:])# ['橙子', '葡萄', '西瓜'](省略结束到末尾)print(fruits[::2])# ['苹果', '橙子', '西瓜'](步长2)print(fruits[::-1])# ['西瓜', '葡萄', '橙子', '香蕉', '苹果'](反转)3. 修改元素
fruits=["苹果","香蕉","橙子"]fruits[0]="草莓"print(fruits)# ['草莓', '香蕉', '橙子']4. 添加元素
fruits=["苹果","香蕉"]# append:末尾添加单个元素fruits.append("橙子")print(fruits)# ['苹果', '香蕉', '橙子']# insert:指定位置插入fruits.insert(1,"草莓")print(fruits)# ['苹果', '草莓', '香蕉', '橙子']# extend:批量添加(拼接另一个列表)fruits.extend(["葡萄","西瓜"])print(fruits)# ['苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']5. 删除元素
fruits=["苹果","香蕉","橙子","香蕉"]# remove:删除第一个匹配的元素fruits.remove("香蕉")print(fruits)# ['苹果', '橙子', '香蕉']# pop:删除指定索引的元素(默认最后一个),并返回该元素removed=fruits.pop()print(removed)# 香蕉print(fruits)# ['苹果', '橙子']# del:按索引删除delfruits[0]print(fruits)# ['橙子']# clear:清空列表fruits.clear()print(fruits)# []6. 常用方法
numbers=[3,1,4,1,5,9,2,6]# 统计元素出现次数print(numbers.count(1))# 2# 查找元素索引(不存在会报错)print(numbers.index(5))# 4# 排序(原地修改)numbers.sort()print(numbers)# [1, 1, 2, 3, 4, 5, 6, 9]# 降序排序numbers.sort(reverse=True)print(numbers)# [9, 6, 5, 4, 3, 2, 1, 1]# 反转numbers.reverse()# 复制new_list=numbers.copy()7. 列表推导式(重点)
列表推导式是Python的特色语法,简洁高效地创建列表。
# 基础形式:[表达式 for 变量 in 可迭代对象]squares=[x**2forxinrange(1,6)]print(squares)# [1, 4, 9, 16, 25]# 带条件筛选evens=[xforxinrange(1,11)ifx%2==0]print(evens)# [2, 4, 6, 8, 10]# 带if-elseresult=["偶数"ifx%2==0else"奇数"forxinrange(1,6)]print(result)# ['奇数', '偶数', '奇数', '偶数', '奇数']# 嵌套推导式(展平二维列表)matrix=[[1,2,3],[4,5,6],[7,8,9]]flat=[numforrowinmatrixfornuminrow]print(flat)# [1, 2, 3, 4, 5, 6, 7, 8, 9]二、元组(Tuple)
元组和列表类似,但不可修改(immutable)。
1. 创建元组
# 空元组empty_tuple=()# 有元素的元组point=(3,4)colors=("红","绿","蓝")# 单元素元组需要逗号(重要!)single=(1,)# 这是元组not_tuple=(1)# 这是整数# 可以省略括号data=1,2,3print(type(data))# <class 'tuple'>2. 元组的操作
point=(3,4)# 访问(和列表一样)print(point[0])# 3# 切片print(point[:1])# (3,)# 拼接new_tuple=point+(5,6)print(new_tuple)# (3, 4, 5, 6)# 重复print(point*2)# (3, 4, 3, 4)# 长度print(len(point))# 2⚠️ 元组不能修改元素,不能添加、删除,否则会报错
TypeError: 'tuple' object does not support item assignment
3. 元组解包
# 基本解包x,y=(3,4)print(x,y)# 3 4# 交换变量(本质是元组解包)a,b=1,2a,b=b,a# 带*的解包first,*rest=[1,2,3,4,5]print(first)# 1print(rest)# [2, 3, 4, 5]*head,last=[1,2,3,4,5]print(head)# [1, 2, 3, 4]print(last)# 5三、列表 vs 元组:如何选择?
| 特性 | 列表(List) | 元组(Tuple) |
|---|---|---|
| 可变性 | 可变 | 不可变 |
| 语法 | [] | () |
| 性能 | 稍慢 | 更快(内存更小) |
| 安全性 | 可被修改 | 数据安全 |
| 可作为字典键 | 不可以 | 可以 |
| 适用场景 | 需要增删改的数据 | 固定不变的数据、函数多返回值 |
选择建议:
- 数据需要变化 → 用列表
- 数据固定不变 → 用元组(如坐标、配置项)
- 函数返回多个值 → 用元组
四、实战:学生成绩统计
# 学生成绩管理scores=[("张三",85),("李四",92),("王五",78),("赵六",95),("钱七",88)]# 计算平均分total=sum(scorefor_,scoreinscores)average=total/len(scores)print(f"平均分:{average:.1f}")# 找出最高分和最低分highest=max(scores,key=lambdax:x[1])lowest=min(scores,key=lambdax:x[1])print(f"最高分:{highest[0]}({highest[1]}分)")print(f"最低分:{lowest[0]}({lowest[1]}分)")# 成绩排序(降序)ranked=sorted(scores,key=lambdax:x[1],reverse=True)print("\n成绩排名:")fori,(name,score)inenumerate(ranked,1):print(f"第{i}名:{name}-{score}分")# 筛选优秀学生(90分以上)excellent=[nameforname,scoreinscoresifscore>=90]print(f"\n优秀学生:{excellent}")运行结果:
平均分: 87.6 最高分: 赵六(95分) 最低分: 王五(78分) 成绩排名: 第1名: 赵六 - 95分 第2名: 李四 - 92分 第3名: 钱七 - 88分 第4名: 张三 - 85分 第5名: 王五 - 78分 优秀学生: ['李四', '赵六']五、常见坑点
- 单元素元组忘记逗号:
(1)是整数,(1,)才是元组 - 列表作为默认参数:函数默认参数用列表会导致共享,应用None
- 遍历列表时删除元素:会导致索引错乱,应遍历副本或倒序删除
- 浅拷贝问题:
new = old是引用,修改一个另一个也变,应用.copy()或old[:]
# 错误示范:浅拷贝a=[1,2,[3,4]]b=a.copy()b[2][0]=99print(a)# [1, 2, [99, 4]] 嵌套元素还是共享的# 深拷贝importcopy c=copy.deepcopy(a)六、课后练习
- 编写程序,输入一组数字,输出其中的最大值、最小值和平均值
- 编写程序,将列表
[1, 2, 3, 4, 5]中的每个元素平方,生成新列表 - 编写程序,去除列表中的重复元素(至少用两种方法)
七、小结
本篇详细讲解了列表和元组的用法,包括增删改查、切片、推导式、元组解包等核心操作。列表适用于可变数据,元组适用于固定数据,合理选择能让代码更高效安全。
📌下一篇预告:《Python字典与集合:键值对与去重的艺术》
本专栏持续更新中,欢迎点赞、收藏、关注三连支持!🐍