CC++ & Algorithm

Python列表高级用法

困难3
语言版本:C++Python
概述:学习如何用切片、排序、列表推导式等高级技巧玩转Python列表,像整理书包一样高效管理数据。

Python列表高级玩法:像整理书包一样高效管理数据

小朋友,你有没有过这样的经历:书包里塞满了课本、文具、零食,想找一本数学书,却要翻半天?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,自己试试吧!

例题精讲

1单选题

已知列表 lst = [1, 2, 3, 4, 5, 6],执行 print(lst[-2::-1]) 后,输出结果是?

A[5, 4, 3, 2, 1]
B[5, 4, 3, 2]
C[6, 5, 4, 3, 2, 1]
D[5, 4, 3, 2, 1, 0]
2判断题

使用列表的 sort() 方法会改变原列表的顺序,而 sorted() 函数会返回一个新列表,原列表保持不变。

3填空题
使用列表推导式生成一个包含 1 到 10 中所有奇数的平方的列表,请将空白处补充完整。

`result = ___`
4单选题

给定列表 words = ['banana', 'apple', 'cherry', 'date'],执行 words.sort(key=len) 后,列表 words 的内容变为?

A['apple', 'banana', 'cherry', 'date']
B['date', 'apple', 'banana', 'cherry']
C['date', 'apple', 'cherry', 'banana']
D['date', 'banana', 'apple', 'cherry']
5判断题

对列表 lst = [1, 2, 3, 4, 5] 执行切片赋值 lst[1:3] = [10, 20, 30] 后,列表会变成 [1, 10, 20, 30, 4, 5],即长度增加了1。