Python 列表(List)是最常用、最灵活的数据结构之一,支持丰富的操作和高级特性。以下从基础概念、高级知识、使用技巧到实际应用场景进行全面讲解:
一、基础概念
1. 定义与特性
- 定义:用方括号
[]表示,元素间用逗号分隔,可包含任意数据类型(整数、字符串、列表、函数等),允许重复。empty_list = [] # 空列表 mixed_list = [1, "hello", 3.14, [5, 6], lambda x: x*2] # 混合类型 - 核心特性:
- 有序性:元素按插入顺序排列,可通过索引访问(正索引从 0 开始,负索引从 -1 开始)。
- 可变性:支持修改、添加、删除元素(与字符串的不可变性不同)。
- 动态性:长度可自动扩展或收缩,无需预先定义大小。
2. 基础操作
(1)访问元素
- 索引访问:
list[index]fruits = ["apple", "banana", "cherry"] print(fruits[0]) # 输出:apple(第一个元素) print(fruits[-2]) # 输出:banana(倒数第二个元素) - 切片访问:
list[start:end:step](左闭右开,step为步长,默认 1)nums = [0, 1, 2, 3, 4, 5] print(nums[1:4]) # [1, 2, 3](索引1到3) print(nums[::2]) # [0, 2, 4](间隔1个取元素) print(nums[::-1]) # [5, 4, 3, 2, 1, 0](反转列表)
(2)修改元素
- 直接通过索引赋值:
fruits[1] = "orange" print(fruits) # ["apple", "orange", "cherry"]
(3)添加元素
append(x):在末尾添加单个元素(高效,O (1))。extend(iterable):在末尾添加可迭代对象的所有元素(如列表、元组)。insert(index, x):在指定索引插入元素(低效,需移动后续元素,O (n))。nums = [1, 2, 3] nums.append(4) # [1, 2, 3, 4] nums.extend([5, 6]) # [1, 2, 3, 4, 5, 6] nums.insert(0, 0) # [0, 1, 2, 3, 4, 5, 6]
(4)删除元素
remove(x):删除第一个值为x的元素(需遍历,O (n))。pop(index):删除指定索引元素(默认最后一个),返回该元素(尾部操作 O (1))。del list[index]:删除指定索引 / 切片元素,或整个列表。clear():清空列表。fruits = ["apple", "banana", "cherry"] fruits.remove("banana") # ["apple", "cherry"] fruits.pop(0) # 返回 "apple",结果 ["cherry"] del fruits[0] # 结果 []
(5)其他基础方法
len(list):返回元素个数。count(x):统计x出现的次数。index(x):返回x第一次出现的索引(不存在则报错)。reverse():原地反转列表(修改原列表)。sort():原地排序(默认升序,可指定key和reverse)。
二、高级知识
1. 内存与性能特性
- 动态扩容:列表底层是动态数组,预分配内存,元素满时自动扩容(通常为原容量的 1.5~2 倍),保证
append()高效。 - 操作效率:
- 尾部操作(
append、pop()):O(1)。 - 头部 / 中间操作(
insert(0)、pop(0)):O (n)(需移动所有元素),大量操作建议用collections.deque(双端队列,O (1))。
- 尾部操作(
2. 列表推导式(List Comprehension)
- 作用:用简洁语法创建列表,替代繁琐的
for循环 +append。 - 语法:
[表达式 for 变量 in 可迭代对象 if 条件] - 示例:
# 生成1-10的平方 squares = [x**2 for x in range(1, 11)] # [1, 4, 9, ..., 100] # 筛选偶数 evens = [x for x in range(1, 20) if x % 2 == 0] # [2, 4, ..., 18] # 嵌套推导式(二维列表展平) matrix = [[1, 2], [3, 4], [5, 6]] flattened = [num for row in matrix for num in row] # [1, 2, 3, 4, 5, 6]
3. 深浅拷贝
- 浅拷贝:仅复制列表本身,嵌套的可变对象(如子列表)仍共享引用。
original = [1, [2, 3]] shallow = original.copy() # 或 original[:]、list(original) shallow[1].append(4) print(original) # [1, [2, 3, 4]](原列表受影响) - 深拷贝:递归复制所有元素(包括嵌套对象),需用
copy.deepcopy()。import copy deep = copy.deepcopy(original) deep[1].append(5) print(original) # [1, [2, 3, 4]](原列表不受影响)
4. 高级切片操作
- 切片赋值:替换子列表,右侧可是任意可迭代对象。
nums = [1, 2, 3, 4] nums[1:3] = [10, 20, 30] # [1, 10, 20, 30, 4] nums[::2] = "abc" # ['a', 10, 'b', 30, 'c'] - 切片删除:批量删除元素。
del nums[1:4] # 删除索引1-3的元素
5. 排序进阶
sort()方法的key参数:自定义排序依据(如长度、属性)。# 按字符串长度排序 words = ["apple", "banana", "cherry"] words.sort(key=lambda x: len(x)) # ['apple', 'cherry', 'banana'] # 按元组第二个元素排序 tuples = [(2, 5), (1, 3), (3, 1)] tuples.sort(key=lambda x: x[1]) # [(3, 1), (1, 3), (2, 5)]
三、使用技巧
-
快速创建重复元素列表:
zeros = [0] * 5 # [0, 0, 0, 0, 0] -
合并列表:
a = [1, 2] b = [3, 4] merged = a + b # [1, 2, 3, 4](创建新列表) a.extend(b) # a 变为 [1, 2, 3, 4](修改原列表) -
检查元素是否存在:用
in/not in(比遍历高效)。if "apple" in fruits: print("存在") -
并行遍历多个列表:用
zip()(取最短列表长度)。names = ["Alice", "Bob"] ages = [25, 30] for name, age in zip(names, ages): print(f"{name} is {age}") # Alice is 25; Bob is 30 -
获取索引与值:用
enumerate()(避免手动维护索引)。for idx, fruit in enumerate(fruits, start=1): # start=1 使索引起始为1 print(f"{idx}: {fruit}") -
列表去重:转为集合再转回列表(但会打乱顺序)。
unique = list(set([1, 2, 2, 3])) # [1, 2, 3](顺序可能变化)
四、实际应用场景
-
存储有序数据:如用户列表、日志记录、成绩排名等。
scores = [90, 85, 95, 88] -
实现栈(Stack):用
append()入栈,pop()出栈(尾部操作高效)。stack = [] stack.append(1) # 入栈 stack.append(2) stack.pop() # 出栈,返回 2 -
实现队列(Queue):简单场景用
append()入队,pop(0)出队(低效);高效场景用collections.deque。from collections import deque queue = deque([1, 2, 3]) queue.append(4) # 入队 queue.popleft() # 出队,返回 1(O(1) 效率) -
滑动窗口算法:处理连续子序列问题(如计算最大子数组和)。
def max_sliding_sum(arr, k): return max(sum(arr[i:i+k]) for i in range(len(arr)-k+1)) print(max_sliding_sum([1, 3, 2, 4], 2)) # 6(3+2 或 2+4) -
数据过滤与转换:用列表推导式快速处理数据。
# 过滤并转换:提取字符串列表中长度>3的元素并大写 words = ["cat", "apple", "dog", "banana"] filtered = [word.upper() for word in words if len(word) > 3] # 结果:["APPLE", "BANANA"] -
多维数据存储:用嵌套列表表示矩阵、表格等。
matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
总结
列表是 Python 中动态、灵活、功能丰富的数据结构,从简单的元素存储到复杂的算法实现(如滑动窗口、栈 / 队列)都有广泛应用。掌握其基础操作、高级特性(如列表推导式、切片)和性能特点,能显著提升代码效率和可读性。实际使用时,需根据场景选择合适的操作(如尾部操作优先,避免频繁头部修改),必要时结合 deque 等结构优化性能。