Python列表操作实战:从基础到进阶的15个核心案例详解
目录导读

-
列表基础操作:创建、访问与修改
-
列表遍历与筛选:for循环与列表推导式
-
列表排序:sort()与sorted()的差异
-
列表增删元素:append、extend与remove的陷阱
-
列表切片与复制:浅拷贝与深拷贝案例
-
列表统计与分析:max、min、sum与count
-
列表扁平化与嵌套处理
-
列表与字符串互转:split与join
-
列表去重与交集运算
-
列表分组与Chunk分片
-
列表索引与enumerate实战
-
列表过滤:filter与条件筛选
-
列表映射:map函数与lambda结合
-
列表排序进阶:多条件排序与自定义key
-
性能优化:列表与生成器的选择
- Q&A常见问题解答
列表基础操作:创建、访问与修改
案例:创建包含学生成绩的列表并修改第三位学生的成绩。
scores = [85, 92, 78, 96, 88] scores[2] = 81 # 修改索引2的值 print(scores[0]) # 输出:85
要点:Python列表索引从0开始,支持负索引(如-1表示最后一个元素),修改时若索引超出范围会抛出IndexError。
列表遍历与筛选:for循环与列表推导式
案例:筛选出所有偶数并计算平方。
nums = [1, 2, 3, 4, 5, 6] even_squares = [n**2 for n in nums if n % 2 == 0] print(even_squares) # 输出:[4, 16, 36]
对比传统写法:
result = []
for n in nums:
if n % 2 == 0:
result.append(n**2)
问答:列表推导式与for循环哪个更快?
答:列表推导式在Python内部以C语言速度运行,通常比显式for循环快2-3倍,但可读性仍需权衡。
列表排序:sort()与sorted()的差异
案例:对混合大小写字符串列表排序。
fruits = ['banana', 'Apple', 'cherry', 'Date'] # sort() 直接修改原列表 fruits.sort(key=str.lower) print(fruits) # 输出:['Apple', 'banana', 'cherry', 'Date'] # sorted() 返回新列表,不修改原列表 sorted_fruits = sorted(fruits, reverse=True)
避坑指南:sort()返回None,不要写成new_list = my_list.sort(),否则new_list会是None。
列表增删元素:append、extend与remove的陷阱
案例:向列表追加多个数字。
a = [1, 2] a.append([3, 4]) # 结果:[1, 2, [3, 4]] a.extend([5, 6]) # 结果:[1, 2, [3, 4], 5, 6] # remove() 只删除第一个匹配项 a.remove(2) # 删除数字2
常见错误:
- 误用
append添加多个元素,导致生成嵌套列表。 remove删除不存在元素会抛出ValueError,需先判断。
列表切片与复制:浅拷贝与深拷贝案例
案例:复制一个包含可变对象的列表。
original = [[1, 2], [3, 4]] shallow = original[:] # 或 list(original) shallow[0][0] = 99 print(original) # 输出:[[99, 2], [3, 4]] (浅拷贝共享子列表) # 深拷贝解决方案 import copy deep = copy.deepcopy(original) deep[0][0] = 100 print(original) # 不受影响
问答:什么时候必须用深拷贝?
答:当列表中包含可变对象(如列表、字典)且需要完全独立的副本时,必须使用copy.deepcopy()。
列表统计与分析:max、min、sum与count
案例:统计学生成绩分布。
grades = [85, 92, 78, 85, 96, 78, 78]
print(f"最高分:{max(grades)},最低分:{min(grades)}")
print(f"总分:{sum(grades)},平均分:{sum(grades)/len(grades):.1f}")
print(f"78分出现次数:{grades.count(78)}") # 输出:3
注意:max()对字符串列表按ASCII码比较,sum()仅对数字有效。
列表扁平化与嵌套处理
案例:将二维列表扁平化为一维。
nested = [[1, 2], [3, 4, 5], [6]] # 方法1:列表推导式(推荐) flat = [item for sublist in nested for item in sublist] print(flat) # 输出:[1, 2, 3, 4, 5, 6] # 方法2:itertools.chain from itertools import chain flat2 = list(chain.from_iterable(nested))
列表与字符串互转:split与join
案例:处理CSV格式数据。
# 字符串→列表
csv_str = "apple,banana,cherry"
items = csv_str.split(",") # ['apple', 'banana', 'cherry']
# 列表→字符串
joined = " | ".join(items) # 'apple | banana | cherry'
常见误区:split()默认按空白分割,指定分隔符时需注意连续分隔符会生成空字符串。
列表去重与交集运算
案例:找出两个列表的公共元素。
list1 = [1, 2, 3, 4, 5, 3] list2 = [3, 4, 5, 6, 7] # 去重(保留顺序) unique = list(dict.fromkeys(list1)) # [1,2,3,4,5] # 交集 intersection = list(set(list1) & set(list2)) # [3,4,5]
性能提示:对于大型列表,先转换为set再进行交集运算,时间复杂度从O(n²)降为O(n)。
列表分组与Chunk分片
案例:将列表按固定长度分组。
data = [1, 2, 3, 4, 5, 6, 7, 8] chunk_size = 3 chunks = [data[i:i+chunk_size] for i in range(0, len(data), chunk_size)] print(chunks) # 输出:[[1, 2, 3], [4, 5, 6], [7, 8]]
列表索引与enumerate实战
案例:找出列表中所有大于80的分数及其索引。
scores = [75, 88, 92, 67, 85] high_scores = [(i, s) for i, s in enumerate(scores) if s > 80] print(high_scores) # 输出:[(1, 88), (2, 92), (4, 85)]
列表过滤:filter与条件筛选
案例:过滤出所有非空字符串。
words = ["hello", "", "world", " ", "python"] filtered = list(filter(None, words)) # 自动过滤空字符串 filtered2 = [w for w in words if w.strip()] # 也过滤空白
列表映射:map函数与lambda结合
案例:将摄氏温度转换为华氏温度。
celsius = [0, 10, 20, 30, 100] fahrenheit = list(map(lambda c: c * 9/5 + 32, celsius)) print(fahrenheit) # 输出:[32.0, 50.0, 68.0, 86.0, 212.0]
列表排序进阶:多条件排序与自定义key
案例:按元组第一个元素升序,第二个元素降序。
data = [(1, 'b'), (2, 'a'), (1, 'a'), (3, 'c')] # 先按第一个元素升序,再按第二个元素降序 data.sort(key=lambda x: (x[0], -ord(x[1]))) print(data) # 输出:[(1, 'b'), (1, 'a'), (2, 'a'), (3, 'c')]
性能优化:列表与生成器的选择
案例:生成1000万个数时的内存比较。
import sys # 列表占用内存 big_list = [i for i in range(10_000_000)] print(sys.getsizeof(big_list)) # 约80MB # 生成器占用内存 big_gen = (i for i in range(10_000_000)) print(sys.getsizeof(big_gen)) # 约112字节
问答:什么时候该用生成器代替列表?
答:当只需遍历一次且数据量很大时,生成器可节省90%以上内存,但需要随机访问或多次遍历时,仍应使用列表。
Q&A常见问题解答
Q1:a.append(b)和a += b有何区别?
A:append(b)将b作为整体追加,等效于extend,会展开b的元素。
a = [1]; a.append([2]) # [1, [2]] b = [1]; b += [2] # [1, 2]
Q2:如何删除列表中的所有匹配项?
A:使用列表推导式生成新列表或while循环删除。
lst = [1, 2, 3, 2, 4] lst[:] = [x for x in lst if x != 2] # [1, 3, 4]
Q3:为什么list.sort()返回None?
A:这是Python的设计哲学——直接修改原对象的操作通常返回None,避免与返回新对象的函数混淆。
Q4:列表嵌套过深如何扁平化?
A:递归解法:
def flatten(lst):
for item in lst:
if isinstance(item, list):
yield from flatten(item)
else:
yield item
通过以上15个案例,您已掌握90%的日常列表操作场景,建议在IDE中亲手运行每个案例,并尝试修改参数观察效果,熟练运用这些技巧后,您会发现80%的Python数据处理任务都可高效完成。