Python 列表操作:驾驭数据集合的万能容器
如果说字符串是珍珠项链那么列表List就是一座百宝箱——它可以装下任意类型的数据数字、字符串、布尔值、甚至其他列表并且允许你随时增删改查、排序翻转、嵌套组合。在 Python 中列表是最常用的数据结构之一几乎任何需要“批量处理”的场景都离不开它。今天我们将以更丰富、更深入的方式带你重新认识列表。从基础定义到进阶技巧一篇搞定1. 什么是列表—— 定义与本质列表是一个有序、可变的容器用方括号[]表示元素之间用逗号分隔。与字符串不同列表是可变的——你可以修改、添加或删除其中的元素。创建列表的几种方式# 直接定义 fruits [apple, banana, cherry] mixed [1, hello, 3.14, True, [1, 2]] # 可以混合类型甚至嵌套 # 使用 list() 构造函数 numbers list(range(5)) # [0, 1, 2, 3, 4] # 列表推导式后文会讲 squares [x**2 for x in range(1, 6)] # [1, 4, 9, 16, 25] # 空列表 empty [] empty2 list()列表与数组的区别Python 的列表比传统数组更灵活因为它可以动态调整大小且不限制元素类型。2. 索引 —— 精准定位从 0 开始与字符串一样列表使用0-based 索引支持正负索引。colors [red, green, blue, yellow, purple] print(colors[0]) # red print(colors[2]) # blue print(colors[-1]) # purple最后一个 print(colors[-3]) # blue倒数第三个索引越界会引发IndexError确保索引在-len(list)到len(list)-1范围内。3. 切片 —— 随心所欲地截取子列表切片语法[start:stop:step]同样适用于列表返回新的列表浅拷贝。nums [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(nums[2:5]) # [2, 3, 4]索引2~4 print(nums[:4]) # [0, 1, 2, 3]从头到索引3 print(nums[6:]) # [6, 7, 8, 9]从索引6到尾 print(nums[::2]) # [0, 2, 4, 6, 8]步长为2 print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]反转 # 切片也可以用于修改部分元素 nums[1:4] [10, 20, 30] # 将索引1~3替换为新列表 print(nums) # [0, 10, 20, 30, 4, 5, 6, 7, 8, 9]4. 遍历 —— 走进列表的每一个角落遍历列表的方式多种多样选择最适合你场景的那一款。基础for循环直接取元素for fruit in fruits: print(fruit)需要索引时用enumeratefor idx, fruit in enumerate(fruits): print(f索引 {idx} 是 {fruit})只遍历索引用rangefor i in range(len(fruits)): print(fruits[i])反向遍历for fruit in reversed(fruits): print(fruit)5. 常用方法 —— 增删改查无所不能Python 列表内置了海量方法我们分类梳理最核心的。添加元素方法说明append(x)在末尾添加一个元素extend(iterable)在末尾追加另一个可迭代对象的所有元素insert(i, x)在索引i处插入元素xlst [1, 2] lst.append(3) # [1, 2, 3] lst.extend([4, 5]) # [1, 2, 3, 4, 5] lst.insert(1, 99) # [1, 99, 2, 3, 4, 5]删除元素方法说明remove(x)删除第一个值为x的元素若不存在则报错pop([i])删除并返回索引i处的元素默认末尾clear()清空所有元素del语句删除指定索引或切片lst [10, 20, 30, 20, 40] lst.remove(20) # [10, 30, 20, 40]只删第一个 popped lst.pop(1) # 删除索引130返回30 lst.pop() # 删除末尾40 del lst[0] # 删除索引0 lst.clear() # []查询与统计方法说明index(x, start, end)返回第一个值为x的索引可限定范围count(x)统计x出现的次数in/not in成员检查nums [1, 2, 3, 2, 4, 2] print(nums.index(2)) # 1 print(nums.count(2)) # 3 print(3 in nums) # True排序与反转方法说明sort(keyNone, reverseFalse)原地排序默认升序reverse()原地反转不排序sorted(iterable)返回新列表内置函数nums [5, 2, 8, 1, 9] nums.sort() # [1, 2, 5, 8, 9] nums.sort(reverseTrue) # [9, 8, 5, 2, 1] nums.reverse() # [1, 2, 5, 8, 9]反转回来 # 不改变原列表返回新列表 new_nums sorted(nums, reverseTrue)复制列表 —— 谨防陷阱列表复制有三种方式深浅拷贝需分清。a [1, 2, [3, 4]] # 1. 浅拷贝仅复制外层引用 b a.copy() # 或 b a[:] 或 b list(a) b[0] 100 # 不影响 a b[2][0] 999 # 但嵌套列表会受影响因为内外层引用了同一个子列表 # 2. 深拷贝完全独立 import copy c copy.deepcopy(a)如果列表元素都是不可变类型数字、字符串、元组浅拷贝足够若包含嵌套的可变对象请用深拷贝。6. 列表推导式 —— 让代码优雅到飞起列表推导式是 Python 最具标志性的语法糖能够一行完成循环条件构造新列表。# 生成平方列表 squares [x**2 for x in range(1, 6)] # [1, 4, 9, 16, 25] # 带条件筛选只取偶数 evens [x for x in range(20) if x % 2 0] # 嵌套循环展开二维矩阵 matrix [[1, 2], [3, 4]] flatten [num for row in matrix for num in row] # [1, 2, 3, 4] # 条件表达式 results [x if x 5 else -1 for x in range(10)] # [-1,-1,-1,-1,-1,-1,6,7,8,9]7. 其他实用技巧解包Unpackingpoint [10, 20] x, y point # 解包到变量 first, *rest [1, 2, 3, 4] # first1, rest[2,3,4]列表连接与重复a [1, 2] [3, 4] # [1, 2, 3, 4] b [0] * 5 # [0, 0, 0, 0, 0]元素最大值/最小值/求和数字列表nums [10, 20, 30] print(max(nums)) # 30 print(min(nums)) # 10 print(sum(nums)) # 60将列表当作栈或队列栈LIFOappend入栈pop()出栈。队列FIFO可用collections.deque代替列表以获得高效popleft。8. 列表与数组的选型建议如果你只需要存储同类型数值且追求性能请使用array模块或 NumPy 数组。如果你需要频繁插入/删除头部元素请考虑collections.deque。但绝大多数通用场景列表已经足够强大且灵活。9. 小彩蛋列表的可变性坑与避坑指南# 坑1将列表作为函数默认参数 def add_to_list(item, target[]): target.append(item) return target print(add_to_list(1)) # [1] print(add_to_list(2)) # [1, 2] —— 默认参数只初始化一次 # 避坑用 None 代替 def add_to_list(item, targetNone): if target is None: target [] target.append(item) return target# 坑2直接赋值只会复制引用 a [1, 2, 3] b a b[0] 100 print(a) # [100, 2, 3] —— a 也被改了 # 避坑使用 b a.copy() 或 a[:]写在最后列表是 Python 中不可或缺的“瑞士军刀”无论你处理数据、实现算法还是管理状态它都能派上大用场。掌握这些操作方法你将拥有驾驭数据集的超能力。下一期我们将探索另一个重量级选手——字典Dict。敬请期待