Python 编程 - 列表(list)

Python 编程 - 列表(list)

在 Python 3 中,list(列表)是一种非常基础且常用的可变序列类型,用于存储一系列有序的元素。下面从基本特性、常用操作、性能及注意事项等方面进行介绍。


1. 核心特性

  • 有序:元素保持插入顺序,可以通过索引访问。
  • 可变:列表创建后可以增、删、改元素。
  • 元素类型任意:一个列表中可以包含不同类型的数据(如整数、字符串、甚至其他列表)。
  • 动态长度:没有固定大小限制,可以根据需要自动扩展或收缩。
  • 可迭代:支持 for 循环、列表推导式等迭代操作。

2. 创建列表

# 空列表
empty = []# 带初始值
numbers = [1, 2, 3]
mixed = [1, "hello", 3.14, [4, 5]]# 使用 list() 构造函数
chars = list("abc")   # ['a', 'b', 'c']
ranged = list(range(5))  # [0, 1, 2, 3, 4]# 列表推导式
squares = [x**2 for x in range(5)]   # [0, 1, 4, 9, 16]

3. 常用操作

3.1 访问与修改

lst = [10, 20, 30, 40]
print(lst[0])    # 10
print(lst[-1])   # 40(负索引从末尾开始)# 修改元素
lst[1] = 25      # [10, 25, 30, 40]# 切片(返回新列表)
sub = lst[1:3]   # [25, 30]

3.2 添加元素

lst = [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](指定位置插入)

3.3 删除元素

lst = [10, 20, 30, 20]
lst.remove(20)         # 删除第一个值为20的元素 -> [10, 30, 20]
popped = lst.pop()     # 弹出并返回最后一个元素(pop(0)可弹出第一个)
del lst[0]             # 删除索引0处的元素
lst.clear()            # 清空列表

3.4 查找与计数

lst = [5, 2, 9, 2]
lst.index(2)           # 返回第一个2的索引 -> 1
lst.count(2)           # 2
2 in lst               # True

3.5 排序与反转

lst = [3, 1, 4]
lst.sort()             # 原地升序 -> [1, 3, 4]
lst.sort(reverse=True) # 原地降序 -> [4, 3, 1]
lst.reverse()          # 原地反转 -> [1, 3, 4]# 不修改原列表,返回新列表
sorted(lst)            # 升序新列表
list(reversed(lst))    # 反转后的新列表

3.6 复制

a = [1, 2, [3, 4]]
b = a.copy()           # 浅拷贝(内层列表仍是引用)
import copy
c = copy.deepcopy(a)   # 深拷贝(完全独立)

4. 常见操作的时间复杂度

操作 平均情况 说明
lst[i] (索引) O(1)
lst.append(x) O(1) 偶尔需要扩容,但均摊为O(1)
lst.pop() O(1) 弹出末尾元素
lst.pop(i) / insert(i, x) O(n) 需要移动后续元素
del lst[i] O(n)
x in lst O(n) 线性搜索
lst.sort() O(n log n) 使用 Timsort 算法
切片 lst[a:b] O(k) k = b-a,产生新列表

5. 列表推导式(List Comprehension)

一种简洁、高效的生成列表的方式:

# 普通写法
squares = []
for x in range(10):squares.append(x**2)# 列表推导式
squares = [x**2 for x in range(10)]# 带条件
evens = [x for x in range(20) if x % 2 == 0]# 嵌套循环
pairs = [(x, y) for x in [1,2] for y in [3,4]]

6. 使用注意事项

  • 浅拷贝陷阱:当列表包含可变对象(如子列表)时,copy()list() 只复制引用,修改内层对象会影响原列表。
  • 作为函数默认参数:避免使用可变默认参数(如 def f(lst=[])),多次调用会共享同一个列表对象。
  • 作为栈和队列append()pop() 可实现栈(LIFO)。若需要高效队列(FIFO),请使用 collections.deque,因为列表的 pop(0) 是 O(n)。
  • 内存占用:列表存储的是对象的引用,每个引用约8字节(64位系统),实际元素占用独立内存。存储大量数值时,可使用 array.arraynumpy.ndarray 节省空间。

7. 与其他类型的对比

类型 可变性 元素类型限制 适用场景
list 可变 任意 通用有序集合
tuple 不可变 任意 不可变的数据集合,字典键
array.array 可变 单一数值类型 内存紧凑,数值运算轻量
numpy.ndarray 可变 单一数值类型 科学计算,向量化操作

8. 总结

  • list 是 Python 中最灵活、最常用的序列容器,适合存储有序且需要频繁修改的任意数据。
  • 掌握索引、切片、追加、插入、删除、排序等核心操作,以及列表推导式,可以高效处理绝大多数数据集合需求。
  • 注意浅拷贝、可变默认参数等常见陷阱,根据场景选择合适的数据结构(如队列用 deque,数值数组用 arraynumpy)。