)
Python中列表的操作超详细版前言列表List是Python中最核心、最常用的数据结构之一。它就像一个万能容器可以存放任意类型的数据并且支持增删改查等各种操作。无论是数据处理、算法实现还是项目开发列表都是你离不开的工具。本文将系统讲解Python列表的6大核心知识点从基础定义到高级操作一篇文章带你彻底掌握列表一、列表的定义列表是由一系列按特定顺序排列的元素组成的集合用方括号[]表示元素之间用逗号隔开。1.1 基本定义方式python# 空列表 empty_list [] print(empty_list) # [] # 存放同类型数据 numbers [1, 2, 3, 4, 5] fruits [苹果, 香蕉, 橘子] print(fruits) # [苹果, 香蕉, 橘子] # 存放不同类型数据Python列表支持 mixed [1, hello, 3.14, True, None] print(mixed) # [1, hello, 3.14, True, None] # 嵌套列表二维列表 matrix [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(matrix) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]1.2 使用 list() 构造函数python# 从字符串转列表 s hello print(list(s)) # [h, e, l, l, o] # 从元组转列表 t (1, 2, 3) print(list(t)) # [1, 2, 3] # 从 range 生成列表 print(list(range(5))) # [0, 1, 2, 3, 4] print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9] # 创建指定长度的列表 zeros [0] * 5 print(zeros) # [0, 0, 0, 0, 0]1.3 列表推导式高级定义python# 生成1-10的平方列表 squares [x**2 for x in range(1, 11)] print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # 带条件的列表推导式只取偶数 evens [x for x in range(1, 21) if x % 2 0] print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] # 嵌套循环的列表推导式 pairs [(x, y) for x in [1, 2] for y in [a, b]] print(pairs) # [(1, a), (1, b), (2, a), (2, b)]二、列表的索引列表中的每个元素都有对应的位置编号从0开始正向编号或从-1开始反向编号。2.1 正向索引从0开始pythonfruits [苹果, 香蕉, 橘子, 西瓜, 葡萄] # 索引 0 1 2 3 4 print(fruits[0]) # 苹果 print(fruits[1]) # 香蕉 print(fruits[3]) # 西瓜 print(fruits[4]) # 葡萄 # 获取列表长度 print(len(fruits)) # 5 print(fruits[len(fruits) - 1]) # 葡萄最后一个元素2.2 反向索引从-1开始pythonfruits [苹果, 香蕉, 橘子, 西瓜, 葡萄] # 索引 -5 -4 -3 -2 -1 print(fruits[-1]) # 葡萄最后一个 print(fruits[-2]) # 西瓜 print(fruits[-3]) # 橘子2.3 索引使用注意事项pythonfruits [苹果, 香蕉, 橘子] # ✅ 正确索引 print(fruits[0]) # 苹果 print(fruits[2]) # 橘子 # ❌ 索引越界错误 # print(fruits[3]) # IndexError: list index out of range # ❌ 负索引不能小于 -len(list) # print(fruits[-4]) # IndexError三、列表的切片切片可以从列表中截取一部分创建新列表语法为list[start:end:step]。3.1 基本切片语法pythonfruits [苹果, 香蕉, 橘子, 西瓜, 葡萄, 草莓, 芒果] # 语法list[起始:结束:步长] # 包含起始位置不包含结束位置 print(fruits[0:3]) # [苹果, 香蕉, 橘子]索引0-2 print(fruits[2:5]) # [橘子, 西瓜, 葡萄]索引2-4 print(fruits[:3]) # [苹果, 香蕉, 橘子]省略起始从0开始 print(fruits[3:]) # [西瓜, 葡萄, 草莓, 芒果]省略结束到末尾 print(fruits[:]) # 全部元素复制整个列表3.2 步长Steppythonfruits [苹果, 香蕉, 橘子, 西瓜, 葡萄, 草莓, 芒果] # 每隔一个取一个 print(fruits[::2]) # [苹果, 橘子, 葡萄, 芒果] # 从索引1开始每隔一个取一个 print(fruits[1::2]) # [香蕉, 西瓜, 草莓] # 反转列表最常用 print(fruits[::-1]) # [芒果, 草莓, 葡萄, 西瓜, 橘子, 香蕉, 苹果]3.3 切片的高级用法pythonnumbers [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 取前3个 print(numbers[:3]) # [0, 1, 2] # 取后3个 print(numbers[-3:]) # [7, 8, 9] # 取除了前3个的所有 print(numbers[3:]) # [3, 4, 5, 6, 7, 8, 9] # 取除了后3个的所有 print(numbers[:-3]) # [0, 1, 2, 3, 4, 5, 6] # 取中间部分 print(numbers[2:7]) # [2, 3, 4, 5, 6] # 取奇数索引的元素 print(numbers[1::2]) # [1, 3, 5, 7, 9] # 取偶数索引的元素 print(numbers[::2]) # [0, 2, 4, 6, 8] # 复制列表两种方式 new_list1 numbers[:] # 方式1 new_list2 numbers.copy() # 方式2 print(new_list1 new_list2) # True3.4 切片 vs 直接赋值重要python# 直接赋值两个变量指向同一个列表 a [1, 2, 3] b a b.append(4) print(a) # [1, 2, 3, 4]a也被修改了 # 切片复制创建新列表 a [1, 2, 3] b a[:] b.append(4) print(a) # [1, 2, 3]a不受影响 print(b) # [1, 2, 3, 4]3.5 切片赋值替换部分元素python# 使用切片替换部分元素 numbers [1, 2, 3, 4, 5, 6] numbers[1:4] [10, 20, 30] print(numbers) # [1, 10, 20, 30, 5, 6] # 切片替换的元素个数可以不同 numbers [1, 2, 3, 4, 5] numbers[1:3] [10, 20, 30, 40] print(numbers) # [1, 10, 20, 30, 40, 4, 5] # 删除切片赋值为空列表 numbers [1, 2, 3, 4, 5] numbers[1:4] [] print(numbers) # [1, 5]四、列表的遍历遍历列表即逐个访问列表中的每个元素。4.1 for 循环直接遍历最常用pythonfruits [苹果, 香蕉, 橘子, 西瓜] for fruit in fruits: print(fruit) # 输出 # 苹果 # 香蕉 # 橘子 # 西瓜 # 遍历时修改元素需要索引 numbers [1, 2, 3, 4, 5] for i, num in enumerate(numbers): numbers[i] num * 2 print(numbers) # [2, 4, 6, 8, 10]4.2 通过索引遍历使用 rangepythonfruits [苹果, 香蕉, 橘子, 西瓜] for i in range(len(fruits)): print(f索引{i}{fruits[i]}) # 输出 # 索引0苹果 # 索引1香蕉 # 索引2橘子 # 索引3西瓜4.3 同时获取索引和元素enumeratepythonfruits [苹果, 香蕉, 橘子, 西瓜] # 默认索引从0开始 for i, fruit in enumerate(fruits): print(f{i}: {fruit}) # 0: 苹果 # 1: 香蕉 # 2: 橘子 # 3: 西瓜 # 指定起始索引 for i, fruit in enumerate(fruits, start1): print(f{i}: {fruit}) # 1: 苹果 # 2: 香蕉 # 3: 橘子 # 4: 西瓜4.4 while 循环遍历pythonfruits [苹果, 香蕉, 橘子, 西瓜] i 0 while i len(fruits): print(fruits[i]) i 1 # 依次输出苹果、香蕉、橘子、西瓜4.5 遍历嵌套列表pythonmatrix [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 遍历二维列表 for row in matrix: for col in row: print(col, end ) print() # 输出 # 1 2 3 # 4 5 6 # 7 8 9 # 使用索引遍历 for i in range(len(matrix)): for j in range(len(matrix[i])): print(fmatrix[{i}][{j}] {matrix[i][j]})4.6 遍历的经典场景python# 1. 找出所有符合条件的元素 numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] even_numbers [] for num in numbers: if num % 2 0: even_numbers.append(num) print(even_numbers) # [2, 4, 6, 8, 10] # 2. 计算总和 numbers [10, 20, 30, 40, 50] total 0 for num in numbers: total num print(total) # 150 # 3. 查找最大值 numbers [23, 45, 12, 67, 34, 89] max_num numbers[0] for num in numbers: if num max_num: max_num num print(max_num) # 89 # 4. 列表去重 numbers [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] unique [] for num in numbers: if num not in unique: unique.append(num) print(unique) # [1, 2, 3, 4]五、列表的常用方法超全汇总5.1 增加元素方法说明示例append(x)在末尾添加一个元素[1,2].append(3)→[1,2,3]insert(i, x)在指定位置插入元素[1,2].insert(1,3)→[1,3,2]extend(iterable)在末尾添加多个元素[1,2].extend([3,4])→[1,2,3,4]拼接两个列表[1,2] [3,4]→[1,2,3,4]*重复列表[1,2] * 3→[1,2,1,2,1,2]python# append - 追加单个元素 fruits [苹果, 香蕉] fruits.append(橘子) print(fruits) # [苹果, 香蕉, 橘子] # insert - 在指定位置插入 fruits.insert(1, 西瓜) print(fruits) # [苹果, 西瓜, 香蕉, 橘子] # extend - 追加多个元素 fruits.extend([草莓, 芒果]) print(fruits) # [苹果, 西瓜, 香蕉, 橘子, 草莓, 芒果] # 拼接创建新列表 list1 [1, 2, 3] list2 [4, 5, 6] list3 list1 list2 print(list3) # [1, 2, 3, 4, 5, 6] # * 重复 print([1, 2, 3] * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]5.2 删除元素方法说明示例remove(x)删除第一个匹配的元素[1,2,2].remove(2)→[1,2]pop(i)删除指定位置元素并返回[1,2,3].pop(1)→2pop()删除最后一个元素并返回[1,2,3].pop()→3clear()清空列表[1,2].clear()→[]del删除元素或列表del list[0]或del list切片赋值删除切片[1,2,3][1:2] []→[1,3]python# remove - 删除第一个匹配的元素 numbers [1, 2, 3, 2, 4, 2] numbers.remove(2) print(numbers) # [1, 3, 2, 4, 2]只删除第一个 # numbers.remove(5) # ValueError: 5 not in list # pop - 删除并返回元素 fruits [苹果, 香蕉, 橘子, 西瓜] last fruits.pop() print(last) # 西瓜 print(fruits) # [苹果, 香蕉, 橘子] second fruits.pop(1) # 删除索引1的元素 print(second) # 香蕉 print(fruits) # [苹果, 橘子] # clear - 清空列表 fruits.clear() print(fruits) # [] # del - 删除元素或列表 fruits [苹果, 香蕉, 橘子, 西瓜] del fruits[1] # 删除索引1的元素 print(fruits) # [苹果, 橘子, 西瓜] del fruits[1:3] # 删除切片 print(fruits) # [苹果] # del fruits # 删除整个列表 # print(fruits) # NameError # 删除所有匹配的元素循环删除 numbers [2, 1, 2, 3, 2, 4, 2] while 2 in numbers: numbers.remove(2) print(numbers) # [1, 3, 4]5.3 查找与统计方法说明示例index(x)查找元素索引不存在报错[1,2,3].index(2)→1count(x)统计元素出现次数[1,2,2].count(2)→2in判断是否包含2 in [1,2,3]→Truenot in判断是否不包含4 not in [1,2,3]→Truepythonfruits [苹果, 香蕉, 橘子, 香蕉, 西瓜] # index - 查找第一个匹配的索引 print(fruits.index(香蕉)) # 1 print(fruits.index(香蕉, 2)) # 3从索引2开始找 # count - 统计出现次数 print(fruits.count(香蕉)) # 2 print(fruits.count(草莓)) # 0 # in / not in print(苹果 in fruits) # True print(草莓 in fruits) # False print(芒果 not in fruits) # True5.4 排序与反转方法说明示例sort()升序排序改变原列表[3,1,2].sort()→[1,2,3]sort(reverseTrue)降序排序改变原列表[3,1,2].sort(reverseTrue)→[3,2,1]reverse()反转列表改变原列表[1,2,3].reverse()→[3,2,1]sorted()返回排序后的新列表sorted([3,1,2])→[1,2,3]reversed()返回反转的迭代器list(reversed([1,2,3]))→[3,2,1]python# sort - 永久排序修改原列表 numbers [3, 1, 4, 1, 5, 9, 2] numbers.sort() print(numbers) # [1, 1, 2, 3, 4, 5, 9] # sort(reverseTrue) - 降序 numbers.sort(reverseTrue) print(numbers) # [9, 5, 4, 3, 2, 1, 1] # 自定义排序根据字符串长度 words [Python, Java, C, JavaScript] words.sort(keylen) print(words) # [C, Java, Python, JavaScript] # sorted - 临时排序返回新列表原列表不变 numbers [3, 1, 4, 1, 5, 9, 2] sorted_numbers sorted(numbers) print(sorted_numbers) # [1, 1, 2, 3, 4, 5, 9] print(numbers) # [3, 1, 4, 1, 5, 9, 2]原列表不变 # sorted(reverseTrue) - 临时降序 print(sorted(numbers, reverseTrue)) # [9, 5, 4, 3, 2, 1, 1] # reverse - 反转列表 fruits [苹果, 香蕉, 橘子] fruits.reverse() print(fruits) # [橘子, 香蕉, 苹果] # 使用切片反转创建新列表 fruits [苹果, 香蕉, 橘子] reversed_fruits fruits[::-1] print(reversed_fruits) # [橘子, 香蕉, 苹果] print(fruits) # [苹果, 香蕉, 橘子]5.5 复制列表方法说明示例copy()浅拷贝[1,2].copy()→[1,2]list()浅拷贝list([1,2])→[1,2][:]浅拷贝[1,2][:]→[1,2]copy.deepcopy()深拷贝需导入copy模块复制嵌套列表python# 浅拷贝 - 创建新列表但嵌套元素仍共享 original [1, 2, [3, 4]] copy1 original.copy() copy2 original[:] copy3 list(original) print(copy1) # [1, 2, [3, 4]] print(copy2) # [1, 2, [3, 4]] print(copy3) # [1, 2, [3, 4]] # 浅拷贝的问题嵌套列表仍指向同一对象 original[2][0] 99 print(copy1) # [1, 2, [99, 4]]copy1也被修改了 # 深拷贝 - 完全独立复制 import copy original [1, 2, [3, 4]] deep_copy copy.deepcopy(original) original[2][0] 99 print(deep_copy) # [1, 2, [3, 4]]不受影响5.6 其他内置函数函数说明示例len()获取长度len([1,2,3])→3max()获取最大值max([1,2,3])→3min()获取最小值min([1,2,3])→1sum()求和数字列表sum([1,2,3])→6any()是否有True元素any([0,0,1])→Trueall()是否所有元素为Trueall([1,2,3])→Truepythonnumbers [10, 20, 30, 40, 50] print(len(numbers)) # 5 print(max(numbers)) # 50 print(min(numbers)) # 10 print(sum(numbers)) # 150 # any / all print(any([0, 0, 1])) # True有真值 print(any([0, 0, 0])) # False print(all([1, 2, 3])) # True全为真值 print(all([1, 0, 2])) # False有假值六、列表推导式高级用法列表推导式是Python中快速生成列表的优雅方式。6.1 基本列表推导式python# 生成1-10的平方 squares [x**2 for x in range(1, 11)] print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # 等价于传统循环 squares [] for x in range(1, 11): squares.append(x**2)6.2 带条件的列表推导式python# 取1-20中的偶数 evens [x for x in range(1, 21) if x % 2 0] print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] # 取既能被2整除又能被3整除的数 nums [x for x in range(1, 51) if x % 2 0 and x % 3 0] print(nums) # [6, 12, 18, 24, 30, 36, 42, 48]6.3 嵌套列表推导式python# 矩阵转置 matrix [[1, 2, 3], [4, 5, 6], [7, 8, 9]] transpose [[row[i] for row in matrix] for i in range(3)] print(transpose) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 展开嵌套列表 nested [[1, 2], [3, 4], [5, 6]] flatten [x for sublist in nested for x in sublist] print(flatten) # [1, 2, 3, 4, 5, 6]6.4 带条件表达式的列表推导式python# 将奇数变为奇数偶数变为偶数 nums [1, 2, 3, 4, 5, 6] result [奇数 if x % 2 1 else 偶数 for x in nums] print(result) # [奇数, 偶数, 奇数, 偶数, 奇数, 偶数]七、列表作为栈和队列7.1 栈LIFO - 后进先出python# 使用 append 和 pop 实现栈 stack [] # 压栈 stack.append(1) stack.append(2) stack.append(3) print(stack) # [1, 2, 3] # 出栈 print(stack.pop()) # 3 print(stack.pop()) # 2 print(stack) # [1]7.2 队列FIFO - 先进先出python# 使用 append 和 pop(0) 实现队列效率低 from collections import deque # 使用 deque 实现高效队列 queue deque() # 入队 queue.append(1) queue.append(2) queue.append(3) print(queue) # deque([1, 2, 3]) # 出队 print(queue.popleft()) # 1 print(queue.popleft()) # 2 print(queue) # deque([3])八、综合实战案例8.1 学生成绩管理系统pythonstudents [ {name: 张三, scores: [85, 90, 78]}, {name: 李四, scores: [92, 88, 95]}, {name: 王五, scores: [70, 75, 80]} ] # 计算每个学生的平均分 for student in students: avg sum(student[scores]) / len(student[scores]) print(f{student[name]} 的平均分{avg:.1f}) # 输出 # 张三 的平均分84.3 # 李四 的平均分91.7 # 王五 的平均分75.0 # 找出最高分 all_scores [score for student in students for score in student[scores]] print(f最高分{max(all_scores)}) # 958.2 列表去重多种方法python# 方法1使用集合顺序可能改变 numbers [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] unique list(set(numbers)) print(unique) # [1, 2, 3, 4]顺序不确定 # 方法2使用字典保持顺序Python 3.7 unique list(dict.fromkeys(numbers)) print(unique) # [1, 2, 3, 4] # 方法3列表推导式保持顺序 unique [] [unique.append(x) for x in numbers if x not in unique] print(unique) # [1, 2, 3, 4]8.3 列表分组python# 将数字按奇偶分组 numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] even [x for x in numbers if x % 2 0] odd [x for x in numbers if x % 2 1] print(f偶数{even}) # [2, 4, 6, 8, 10] print(f奇数{odd}) # [1, 3, 5, 7, 9]8.4 二维列表操作矩阵python# 创建3x3单位矩阵 matrix [[1 if i j else 0 for j in range(3)] for i in range(3)] print(matrix) # [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 矩阵相加 A [[1, 2], [3, 4]] B [[5, 6], [7, 8]] C [[A[i][j] B[i][j] for j in range(2)] for i in range(2)] print(C) # [[6, 8], [10, 12]]8.5 列表排序按指定规则python# 按元组第二个元素排序 pairs [(1, 3), (4, 1), (2, 5), (3, 2)] pairs.sort(keylambda x: x[1]) print(pairs) # [(4, 1), (3, 2), (1, 3), (2, 5)] # 按字符串长度排序 words [Python, Java, C, JavaScript, Go] words.sort(keylen) print(words) # [C, Go, Java, Python, JavaScript] # 按字符串最后一个字母排序 words [apple, banana, cherry, date] words.sort(keylambda x: x[-1]) print(words) # [banana, apple, date, cherry]九、常见错误与注意事项9.1 修改列表时遍历的错误python# ❌ 错误遍历时删除元素会导致索引错乱 numbers [1, 2, 3, 4, 5] for num in numbers: if num % 2 0: numbers.remove(num) print(numbers) # [1, 3, 5]勉强正确但不可靠 # ✅ 正确遍历副本 numbers [1, 2, 3, 4, 5] for num in numbers[:]: # 遍历副本 if num % 2 0: numbers.remove(num) print(numbers) # [1, 3, 5] # ✅ 更优使用列表推导式 numbers [1, 2, 3, 4, 5] numbers [num for num in numbers if num % 2 ! 0] print(numbers) # [1, 3, 5]9.2 浅拷贝 vs 深拷贝python# ❌ 浅拷贝嵌套列表会被共享 original [[1, 2], [3, 4]] copy original[:] original[0][0] 99 print(copy) # [[99, 2], [3, 4]]copy也被修改了 # ✅ 深拷贝完全独立 import copy original [[1, 2], [3, 4]] deep_copy copy.deepcopy(original) original[0][0] 99 print(deep_copy) # [[1, 2], [3, 4]]不受影响9.3 列表作为函数参数python# ❌ 列表作为默认参数会被共享 def add_item(item, lst[]): lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [1, 2]不是[2] # ✅ 使用 None 作为默认值 def add_item(item, lstNone): if lst is None: lst [] lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [2]9.4 性能优化python# ❌ 频繁使用 拼接每次创建新列表 result [] for i in range(10000): result result [i] # 效率极低 # ✅ 使用 append result [] for i in range(10000): result.append(i) # 效率高 # ✅ 使用列表推导式最快 result [i for i in range(10000)] # 最推荐总结本文详细介绍了Python列表的6大核心知识点知识点要点定义[]、list()、列表推导式索引正向从0开始反向从-1开始切片list[start:end:step]灵活截取和复制遍历for循环、enumerate、while循环常用方法增删改查、排序、反转、复制等列表推导式快速生成列表的优雅方式重点掌握索引和切片是列表操作的基础列表推导式是Python的特色语法浅拷贝和深拷贝的区别排序时sort()和sorted()的区别遍历列表时不要直接修改原列表希望这篇教程能帮助你全面掌握Python列表操作如果觉得有用欢迎点赞、收藏、评论下一篇预告Python中字典的操作敬请期待