Python列表高级用法
困难3Python列表高级玩法:像整理书包一样高效管理数据
小朋友,你有没有过这样的经历:书包里塞满了课本、文具、零食,想找一本数学书,却要翻半天?Python的列表就像你的书包,我们已经学会了把东西放进去、取出来。但还有更厉害的方法:切片、排序、列表推导式等,能让你像变魔术一样快速整理和操作数据。
下面我们就来逐个解锁这些高级技巧,让你处理列表又快又好玩!
1. 切片:一次性取出任意一段
切片就像你用手指在书架上隔出一段来。例如,你有5本书按顺序摆放,想取出中间3本,只要告诉计算机“从第2本开始,取到第4本之前”就行了。
books = ["语文", "数学", "英语", "科学", "美术"] # 放书
# 索引: 0 1 2 3 4
print(books[1:4]) # 从索引1(数学)到索引4(科学)之前,即 [数学, 英语, 科学]
切片格式:列表[开始:结束:步长]
- 开始:从哪个索引开始(包含)
- 结束:到哪个索引为止(不包含)
- 步长:每隔几个取一个(默认1,可以负)
更多例子:
- 取前三个:
books[:3]相当于books[0:3] - 取后两个:
books[-2:]负索引从尾部往前数 - 每隔一个取:
books[::2]得到["语文", "英语", "美术"] - 翻转整个列表:
books[::-1]得到["美术", "科学", "英语", "数学", "语文"]
生活例子:周末去游乐园,排队时你想把队伍倒序报数,就可以用 队伍[::-1]。
2. 排序:把东西按规则排整齐
书包里的书如果乱七八糟,找起来很烦。排序可以帮你按名字、大小、分数等排好。
Python提供了两种排序方式:
临时排序:sorted()
sorted(列表) 会返回一个新列表,原列表不变。
numbers = [3, 1, 4, 1, 5] # 原始数字
new_numbers = sorted(numbers) # 得到排序后的新列表
print(new_numbers) # [1, 1, 3, 4, 5]
print(numbers) # 原列表还是 [3, 1, 4, 1, 5]
永久排序:列表.sort()
列表.sort() 直接修改原列表,没有返回值。
numbers.sort() # 修改原列表
print(numbers) # [1, 1, 3, 4, 5]
按长度排序:比如按名字字数排,可以使用 key=len
names = ["小明", "小红", "小刚", "小丽"] # 名字列表
names.sort(key=len) # 按名字的字数排序(从短到长)
print(names) # 都俩字,所以顺序不变
倒序:加参数 reverse=True
scores = [88, 92, 76, 84, 95] # 考试成绩
scores.sort(reverse=True) # 从高到低排序
print(scores) # [95, 92, 88, 84, 76]
生活例子:期末考试后,老师用 sorted(scores, reverse=True) 快速得到班级成绩排名。
3. 列表推导式:一条语句造出整个列表
你有没有想过,用数学公式一次生成很多数?列表推导式就是这种“魔法公式”。
基本形式:[表达式 for 变量 in 可迭代对象 if 条件]
生成平方数
squares = [x**2 for x in range(1,6)] # 生成1到5的平方
print(squares) # [1, 4, 9, 16, 25]
带条件:只取偶数
evens = [x for x in range(10) if x % 2 == 0] # 0-9中的偶数
print(evens) # [0, 2, 4, 6, 8]
实战:把全班同学的分数变成“及格/不及格”
scores = [59, 88, 45, 72, 95] # 分数列表
results = ["及格" if s >= 60 else "不及格" for s in scores]
print(results) # ['不及格', '及格', '不及格', '及格', '及格']
生活例子:零花钱翻倍计划——[m * 2 for m in money] 就能算出每个星期零花钱加倍后的结果!
4. 合并与重复:用+和*快速组合列表
把两个书包的物品合到一个书包,可以用 +;想把一个笔记本复印三份,可以用 *。
# 合并两个列表
list_a = ["铅笔", "橡皮"] # 文具A
list_b = ["尺子", "圆规"] # 文具B
all_stuff = list_a + list_b # 合并成一个新列表
print(all_stuff) # ['铅笔', '橡皮', '尺子', '圆规']
# 重复列表
cheer = ["加油"] * 3 # 重复3次
print(cheer) # ['加油', '加油', '加油']
注意:+ 只能连接两个列表(类型要相同),* 只能跟整数。
5. 常见错误与避坑指南
❌ 错误1:切片索引超出范围
book = ["A", "B", "C"]
print(book[10]) # IndexError: list index out of range
正确做法:切片即使超出也不会报错,只会返回空列表,但直接取元素会报错。
❌ 错误2:混淆sorted()和sort()
my_list = [3, 1, 2]
result = my_list.sort() # sort()返回None
print(result) # None,不是排序后的列表
纠错:想要新列表用 sorted();想直接改原列表用 .sort()。
❌ 错误3:列表推导式里忘记写条件
# 想取所有正数,却忘记了if
nums = [-1, 2, -3, 4]
positive = [x for x in nums] # 没写条件,全取了
纠错:有条件一定要加 if。
❌ 错误4:用+号合并不同类型的序列
[1, 2] + "hello" # TypeError: can only concatenate list (not "str") to list
纠错:只能列表+列表,可以先把字符串变成列表:[1,2] + list("hello")
6. 完整示例:班级成绩大管家
把今天学到的所有技巧用在一个程序里,写一个真正能用的“成绩管家”。
# 班级成绩大管家.py
# 假设我们有一个成绩列表
scores = [88, 92, 76, 84, 95, 63, 57, 79] # 8个学生的分数
print("=== 成绩管理小工具 ===")
# 1. 切片:查看前3名 (按原顺序)
top3_raw = scores[:3] # 前三个分数
print("原始前3个分数:", top3_raw) # [88, 92, 76]
# 2. 排序:从高到低排(临时排序)
sorted_high_to_low = sorted(scores, reverse=True) # 排序后的新列表
print("从高到低排序:", sorted_high_to_low) # [95, 92, 88, 84, 79, 76, 63, 57]
# 3. 列表推导式:生成所有分数对应的等级
grades = ["优秀" if s >= 85
else "良好" if s >= 70
else "及格" if s >= 60
else "不及格" for s in scores]
print("等级列表:", grades) # ['优秀', '优秀', '良好', '良好', '优秀', '及格', '不及格', '良好']
# 4. 合并:假设两个班的成绩要合并
other_class_scores = [68, 100, 72] # 另一个班的分数
all_scores = scores + other_class_scores # 合并两个列表
print("合并后总成绩:", all_scores)
# 5. 重复:把"加油"重复3次,为每个人打气
cheer_list = ["加油"] * 3
print("打气词:", cheer_list) # ['加油', '加油', '加油']
运行结果:
=== 成绩管理小工具 ===
原始前3个分数: [88, 92, 76]
从高到低排序: [95, 92, 88, 84, 79, 76, 63, 57]
等级列表: ['优秀', '优秀', '良好', '良好', '优秀', '及格', '不及格', '良好']
合并后总成绩: [88, 92, 76, 84, 95, 63, 57, 79, 68, 100, 72]
打气词: ['加油', '加油', '加油']
7. 下一步学什么?
掌握了列表的高级用法,你可以试试这些相关的知识:
- 元组:和列表很像,但不能修改,适合保存固定数据。
- 字符串:也支持切片、
in判断等操作,但排序要额外处理。 - 字典:用键值对存数据,比如“姓名: 分数”,排序时可以用
sorted(dict.items())。 - 集合:去重、交集并集,适合数学运算。
列表就像百宝箱,掌握了高级用法,你就能优雅地解决很多编程问题。现在就打开Python,自己试试吧!
例题精讲
已知列表 lst = [1, 2, 3, 4, 5, 6],执行 print(lst[-2::-1]) 后,输出结果是?
使用列表的 sort() 方法会改变原列表的顺序,而 sorted() 函数会返回一个新列表,原列表保持不变。
使用列表推导式生成一个包含 1 到 10 中所有奇数的平方的列表,请将空白处补充完整。
`result = ___`给定列表 words = ['banana', 'apple', 'cherry', 'date'],执行 words.sort(key=len) 后,列表 words 的内容变为?
对列表 lst = [1, 2, 3, 4, 5] 执行切片赋值 lst[1:3] = [10, 20, 30] 后,列表会变成 [1, 10, 20, 30, 4, 5],即长度增加了1。