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() 高效。
  • 操作效率
    • 尾部操作(appendpop()):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)]
    

三、使用技巧

  1. 快速创建重复元素列表

    zeros = [0] * 5  # [0, 0, 0, 0, 0]
    
  2. 合并列表

    a = [1, 2]
    b = [3, 4]
    merged = a + b  # [1, 2, 3, 4](创建新列表)
    a.extend(b)     # a 变为 [1, 2, 3, 4](修改原列表)
    
  3. 检查元素是否存在:用 in / not in(比遍历高效)。

    if "apple" in fruits:
        print("存在")
    
  4. 并行遍历多个列表:用 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
    
  5. 获取索引与值:用 enumerate()(避免手动维护索引)。

    for idx, fruit in enumerate(fruits, start=1):  # start=1 使索引起始为1
        print(f"{idx}: {fruit}")
    
  6. 列表去重:转为集合再转回列表(但会打乱顺序)。

    unique = list(set([1, 2, 2, 3]))  # [1, 2, 3](顺序可能变化)
    

四、实际应用场景

  1. 存储有序数据:如用户列表、日志记录、成绩排名等。

    scores = [90, 85, 95, 88]
    
  2. 实现栈(Stack):用 append() 入栈,pop() 出栈(尾部操作高效)。

    stack = []
    stack.append(1)  # 入栈
    stack.append(2)
    stack.pop()      # 出栈,返回 2
    
  3. 实现队列(Queue):简单场景用 append() 入队,pop(0) 出队(低效);高效场景用 collections.deque

    from collections import deque
    queue = deque([1, 2, 3])
    queue.append(4)  # 入队
    queue.popleft()  # 出队,返回 1(O(1) 效率)
    
  4. 滑动窗口算法:处理连续子序列问题(如计算最大子数组和)。

    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)
    
  5. 数据过滤与转换:用列表推导式快速处理数据。

    # 过滤并转换:提取字符串列表中长度>3的元素并大写
    words = ["cat", "apple", "dog", "banana"]
    filtered = [word.upper() for word in words if len(word) > 3]
    # 结果:["APPLE", "BANANA"]
    
  6. 多维数据存储:用嵌套列表表示矩阵、表格等。

    matrix = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
    

总结

列表是 Python 中动态、灵活、功能丰富的数据结构,从简单的元素存储到复杂的算法实现(如滑动窗口、栈 / 队列)都有广泛应用。掌握其基础操作、高级特性(如列表推导式、切片)和性能特点,能显著提升代码效率和可读性。实际使用时,需根据场景选择合适的操作(如尾部操作优先,避免频繁头部修改),必要时结合 deque 等结构优化性能。