Python列表高级用法
中等0从书包到数据高手——Python列表高级玩法
想象一下,你的书包里装着课本、文具、零食……如果要快速拿出第三本书,或者把巧克力插在第二本笔记本后面,或者倒出所有物品重新排列——这些操作,Python 列表都能轻松做到。列表是编程中最常用的“万能收纳盒”,学完基础创建后,掌握切片、增删、查找和排序这些高级技巧,你就能像整理书包一样灵活地管理数据,无论是班级成绩、零花钱记录,还是游戏背包。
1. 切片:像用尺子量出一段
切片可以一次性取出列表中的一段连续元素,就像用书签标记出一段内容。语法是 列表[开始:结束:步长],注意:结束位置的元素不被包含在内。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 数字列表
# 取前3个元素(索引0到2)
print(numbers[0:3]) # 输出 [0, 1, 2]
# 从索引2开始到最后(省略结束索引)
print(numbers[2:]) # 输出 [2, 3, 4, 5, 6, 7, 8, 9]
# 前5个元素,每两个取一个(步长为2)
print(numbers[0:5:2]) # 输出 [0, 2, 4]
# 每两个取一个,从头到尾(步长2)
print(numbers[::2]) # 输出 [0, 2, 4, 6, 8]
# 翻转整个列表(步长为-1)
print(numbers[::-1]) # 输出 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# 负索引也可以:取最后三个
print(numbers[-3:]) # 输出 [7, 8, 9]
生活中例子:你想从第5分钟到第10分钟的视频里每隔2分钟截一张图,切片 video[5:10:2] 就搞定了。
☑️ 小贴士:
- 开始、结束、步长都可以省略。省略开始默认0,省略结束默认末尾,省略步长默认1。
- 切片永远不会报索引越界错误,它会自动“截断”到有效范围:
print(numbers[0:100]) # [0,1,2,3,4,5,6,7,8,9] 不会报错 print(numbers[5:2]) # [] 因为开始大于结束,返回空列表
2. 添加和删除元素:随心调整书包里的东西
就像往书包里放书或扔掉不想要的东西,Python 提供了几种常用方法。
常用方法一览
| 方法 | 作用 | 例子 |
|---|---|---|
append(item) | 在末尾添加一个元素(像往书包最上面放一本新书) | fruit.append('葡萄') |
insert(index, item) | 在指定位置插入(像在书包中间插进一本书) | fruit.insert(1, '草莓') |
pop(index) | 删除并返回指定位置的元素(像抽出某一本书),不写index就删除最后一个 | fruit.pop() 或 fruit.pop(1) |
remove(item) | 删除第一个匹配的元素(像扔掉第一本有某个名字的书) | fruit.remove('橘子') |
del 列表[index] | 删除指定位置元素(不返回),也可删除一段切片 | del fruit[0] 或 del fruit[1:3] |
fruit = ['苹果', '香蕉', '橘子'] # 水果列表
fruit.append('葡萄') # 末尾加葡萄
print(fruit) # ['苹果', '香蕉', '橘子', '葡萄']
fruit.insert(1, '草莓') # 在索引1插入草莓
print(fruit) # ['苹果', '草莓', '香蕉', '橘子', '葡萄']
fruit.pop() # 删除最后一个'葡萄'
fruit.pop(1) # 删除索引1的'草莓'
fruit.remove('橘子') # 删除第一个'橘子'
print(fruit) # ['苹果', '香蕉']
# 使用del删除
my_list = [10, 20, 30, 40] # 数字列表
del my_list[1] # 删除索引1的20
print(my_list) # [10, 30, 40]
del my_list[0:2] # 删除前两个元素
print(my_list) # [40]
❓ 常见错误:
remove()只删除第一个匹配项。如果列表里有多个相同的元素,它不会全部删除。pop()或del如果索引超出范围会报IndexError。remove()如果元素不存在会报ValueError。建议先用in判断:if '哈密瓜' in fruit: fruit.remove('哈密瓜')
3. 查找和计数:找到铅笔,数数有几块橡皮
index(item):返回某个元素第一次出现的索引。如果找不到,程序会报错。count(item):数一数某个元素出现了几次。in关键字:判断元素是否存在,返回True或False,比index更安全。
scores = [88, 92, 88, 76, 88] # 考试成绩列表
print(scores.index(92)) # 输出 1(92在索引1)
print(scores.count(88)) # 输出 3(88出现了3次)
# 安全查找:先判断是否存在
if 92 in scores:
pos = scores.index(92)
print(f"92分在位置{pos}") # 输出 "92分在位置1"
else:
print("没找到92分")
# 也可以用index捕获异常
try:
pos = scores.index(100) # 100不在列表中
except ValueError:
print("100不在成绩中")
生活中例子:你记录了一周的零花钱 pocket = [10, 20, 10, 50, 10],想知道10元出现了几次,pocket.count(10) 就得出来3次。
4. 排序与反转:把书按大小排好,或者倒着放
sort():原地排序(改变原列表),默认从小到大。sorted():返回一个新列表,原列表不变。可以加参数reverse=True实现降序。reverse():把列表顺序颠倒过来(原地操作)。
nums = [3, 1, 4, 1, 5, 9] # 数字列表
nums.sort() # 原地从小到大排序
print(nums) # [1, 1, 3, 4, 5, 9]
nums.reverse() # 原地颠倒顺序
print(nums) # [9, 5, 4, 3, 1, 1]
# 用sorted得到新列表,原列表不变
original = [3, 1, 4]
new_list = sorted(original) # 返回新列表
print(original) # [3, 1, 4] 不变
print(new_list) # [1, 3, 4]
# 降序排序
print(sorted(original, reverse=True)) # [4, 3, 1]
❓ 常见错误:
sort()方法返回值是None,不要写成nums = nums.sort(),这会丢失原列表!正确做法是直接nums.sort()。reverse()同理,也是原地操作,返回None。- 如果列表里有不同类型(比如数字和字符串混合),
sort()会报错。
进阶:按规则排序
sort() 和 sorted() 还有一个 key 参数,可以指定排序依据。比如按字符串长度排序:
words = ['banana', 'apple', 'kiwi'] # 单词列表
words.sort(key=len) # 按单词长度排序
print(words) # ['kiwi', 'apple', 'banana']
5. 额外技巧:列表推导式——一行生成新列表
虽然不在基础列表方法里,但它是非常实用的“高级用法”。比如你想快速生成1到10的平方数,传统写法要写好几行,而列表推导式一行搞定:
# 传统写法
squares = []
for i in range(1, 11):
squares.append(i * i)
# 列表推导式(推荐)
squares = [i * i for i in range(1, 11)] # 平方数列表
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 还可以加条件:只取偶数
evens = [x for x in range(10) if x % 2 == 0] # 偶数列表
print(evens) # [0, 2, 4, 6, 8]
列表推导式就像用模板快速批量生产列表,写起来简洁又高效。
完整示例:班级成绩管理系统
下面结合所有技巧,模拟老师管理一个班级的考试成绩:
# 初始成绩列表(全班10人)
scores = [85, 92, 78, 90, 88, 76, 95, 82, 91, 84] # 成绩列表
# 1. 切片:取前5名(假设按原顺序)
print("前5个成绩:", scores[:5]) # [85, 92, 78, 90, 88]
# 2. 添加:新同学考了88分
scores.append(88) # 末尾添加
print("添加后:", scores)
# 3. 删除:一位同学转学,删除索引2的成绩(78分)
removed_score = scores.pop(2) # 弹出并返回
print(f"删除了{removed_score}分,现在列表: {scores}")
# 4. 查找:找到92分的位置
if 92 in scores:
pos = scores.index(92)
print(f"92分在索引{pos}")
else:
print("没有92分")
# 5. 查找:计算90分以上的人数
high_count = sum(1 for s in scores if s >= 90) # 使用生成器表达式
print(f"90分以上有{high_count}人")
# 6. 排序:按分数从高到低排列
scores_sorted = sorted(scores, reverse=True) # 降序新列表
print("成绩排名(降序):", scores_sorted)
# 7. 反转:将原列表颠倒试试
scores.reverse()
print("原列表颠倒:", scores)
# 8. 列表推导式:生成每个成绩的等级(>90为A,>80为B,其余C)
grades = ['A' if s >= 90 else 'B' if s >= 80 else 'C' for s in scores_sorted]
print("对应等级:", grades)
运行这段程序,你会看到成绩被灵活处理的全过程。
总结与相关指引
列表高级用法让你的数据处理效率翻倍。记住几个要点:
- 切片不报错,索引操作要小心越界
sort()和reverse()原地操作,sorted()和reversed()返回新对象remove()只删第一个,pop()按位置删- 列表推导式比循环更简洁
接下来你可以学习:
- 元组:和列表相似但不可修改,适合存储固定数据(如一周的天数)
- 字符串:也支持切片、
index、count等操作,用法类似 - 字典:用“键”来查找值,像查字典一样快
- 队列与栈:用列表模拟先进先出(队列)或后进先出(栈)的数据结构
掌握列表,就等于拿到了 Python 数据管理的钥匙,快去试试整理你自己的“书包”吧!
例题精讲
下列哪个选项可以正确获取列表 my_list = [10, 20, 30, 40, 50] 中的元素 [20, 30, 40]?
已知列表 fruits = ['apple', 'banana'],执行以下哪个操作后,fruits 变为 ['apple', 'banana', 'grape', 'orange']?
执行 my_list = [1, 2, 3, 2, 4]后,再执行 my_list.remove(2),最终 my_list 为 [1, 3, 2, 4]。
使用列表推导式生成一个包含1到10之间所有偶数的平方的列表,补全代码:
even_squares = [x**2 for x in range(1, 11) if ___]给定列表 lst = [10, 20, 30, 40, 50],请用切片操作将列表反转并赋值给 new_lst,补全代码:
new_lst = lst[___]