欢迎光临
我们一直在努力

【Python 列表操作:定义、索引、切片、遍历常用方法,一篇搞定!】

Python 列表操作:定义、索引、切片、遍历与 18 个常用方法,一篇搞定!

摘要

本文从零开始系统讲解 Python 列表的全部核心操作。从列表的定义与创建讲起,深入索引正负取值规则和切片步长技巧,覆盖三种遍历方式和嵌套列表处理,最后用表格速览 append、extend、sort、pop、copy 等 18 个常用方法及其时间复杂度。文末附有速查表和常见坑点总结,适合 Python 初学者和需要系统性复习列表操作的开发者。

Python 列表是使用频率最高的内置数据结构。掌握它的 18 个常用方法,等于拿下 80% 的数据处理场景。

列表(list)是 Python 中最灵活、最常用的内置数据结构。它是有序的、可变的、可包含任意类型元素的容器。无论你是写脚本、做数据分析还是 Web 开发,列表操作几乎出现在每一段代码中。

本文将带你从定义开始,逐步深入索引、切片、遍历三大核心操作,最后用表格快速查阅 18 个常用方法。


一、基础认识

1.1 什么是列表

列表是 Python 内置的有序、可变、可重复的序列类型,用方括号 [] 表示,元素之间用逗号分隔。

# 空列表
empty = []
print(empty) # []

# 整数列表
nums = [1, 2, 3, 4, 5]
print(nums) # [1, 2, 3, 4, 5]

# 混合类型列表
mixed = [1, "hello", 3.14, True, [1, 2]]
print(mixed) # [1, 'hello', 3.14, True, [1, 2]]

列表中的元素可以是任意 Python 对象,包括另一个列表(形成嵌套列表)。与字符串和元组不同,列表创建后可以任意增、删、改。

1.2 五种创建方式

# 1. 字面量创建
a = [1, 2, 3]

# 2. list() 构造器从可迭代对象创建
b = list("abc") # ['a', 'b', 'c']
c = list(range(5)) # [0, 1, 2, 3, 4]
d = list((1, 2, 3)) # [1, 2, 3] 从元组转换

# 3. 列表推导式
e = [x ** 2 for x in range(5)] # [0, 1, 4, 9, 16]

# 4. 乘法创建重复元素列表
f = [0] * 5 # [0, 0, 0, 0, 0]

# 5. split() 从字符串创建
g = "apple,banana,cherry".split(",") # ['apple', 'banana', 'cherry']

创建方式适用场景示例
[] 字面量 已知元素直接写 [1, 2, 3]
list() 构造器 从其他可迭代对象转换 list(range(10))
列表推导式 根据规则生成 [i*2 for i in range(5)]
乘法 [x]*n 创建重复元素的定长列表 [0]*10
split() 字符串解析 "a,b".split(",")

注意:[[]] * 3 会创建三个指向同一子列表的引用,修改一个会影响全部。需要独立子列表时用列表推导式:[[] for _ in range(3)]。


二、核心操作

2.1 索引 —— 精准定位元素

Python 列表支持正向索引(从左到右,从 0 开始)和反向索引(从右到左,从 -1 开始)。

nums = [10, 20, 30, 40, 50]

# 正向索引:0, 1, 2, 3, 4
print(nums[0]) # 10 第一个元素
print(nums[2]) # 30 第三个元素
print(nums[4]) # 50 最后一个元素

# 反向索引:-1, -2, -3, -4, -5
print(nums[1]) # 50 最后一个元素
print(nums[2]) # 40 倒数第二个
print(nums[5]) # 10 倒数第五个(即第一个)

# 索引越界会报错
# print(nums[5]) # IndexError: list index out of range
# print(nums[-6]) # IndexError: list index out of range

索引规则速记:

位置正向索引反向索引
第 1 个元素 0 -n
第 2 个元素 1 -(n-1)
第 i 个元素 i-1 -(n-i+1)
最后 1 个元素 n-1 或 -1 -1

2.2 切片 —— 批量截取子列表

切片语法:list[start:stop:step],三个参数均可省略。

  • start:起始索引(包含),默认 0
  • stop:结束索引(不包含),默认到末尾
  • step:步长,默认 1;负数表示反向取

nums = [10, 20, 30, 40, 50, 60, 70, 80]

# 基础切片
print(nums[1:5]) # [20, 30, 40, 50] 索引 1 到 4,不含 5
print(nums[:4]) # [10, 20, 30, 40] start 省略,从 0 开始
print(nums[3:]) # [40, 50, 60, 70, 80] stop 省略,到末尾
print(nums[:]) # [10, 20, …, 80] 完整复制(浅拷贝)

# 带步长
print(nums[::2]) # [10, 30, 50, 70] 每隔一个取
print(nums[1:7:2]) # [20, 40, 60] 从索引 1 到 6,步长 2

# 反向切片
print(nums[::1]) # [80, 70, 60, 50, 40, 30, 20, 10] 反转列表
print(nums[5:1:1]) # [60, 50, 40, 30] 从索引 5 递减到索引 2
print(nums[1:5:1]) # [80, 70, 60, 50] 反向取最后 4 个

# 切片的容错性非常好——越界不会报错
print(nums[2:100]) # [30, 40, 50, 60, 70, 80] 自动截断

切片口诀:[起始:结束:步长],左闭右开不含尾,步长默认 1,负数反向走,省略即到头。

2.3 遍历 —— 三种常用方式

fruits = ["apple", "banana", "cherry"]

# 方式 1:直接遍历元素 —— 最简洁
for fruit in fruits:
print(fruit)
# 输出:
# apple
# banana
# cherry

# 方式 2:enumerate() —— 同时要索引和值
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
# 输出:
# 0: apple
# 1: banana
# 2: cherry

# enumerate 可指定起始编号
for i, fruit in enumerate(fruits, start=1):
print(f"{i}. {fruit}")
# 输出:
# 1. apple
# 2. banana
# 3. cherry

# 方式 3:range(len()) —— 按索引遍历
for i in range(len(fruits)):
print(f"fruits[{i}] = {fruits[i]}")
# 输出:
# fruits[0] = apple
# fruits[1] = banana
# fruits[2] = cherry

遍历方式适用场景性能
for x in list 只关心元素值 最快
enumerate(list) 需要索引 + 值
range(len(list)) 需要索引做复杂操作 略慢

2.4 嵌套列表的遍历

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

# 二维遍历
for row in matrix:
for item in row:
print(item, end=" ")
# 输出:1 2 3 4 5 6 7 8 9

# 带索引的二维遍历
for i, row in enumerate(matrix):
for j, val in enumerate(row):
print(f"matrix[{i}][{j}] = {val}")
# 输出:
# matrix[0][0] = 1
# matrix[0][1] = 2
# …


三、18 个常用方法大全

3.1 增加元素

nums = [1, 2, 3]

# 1. append(x) —— 尾部追加单个元素(最常用)
nums.append(4)
print(nums) # [1, 2, 3, 4]

# 2. extend(iterable) —— 尾部追加多个元素
nums.extend([5, 6])
print(nums) # [1, 2, 3, 4, 5, 6]

# 3. insert(i, x) —— 在指定索引处插入
nums.insert(0, 0) # 在开头插入
print(nums) # [0, 1, 2, 3, 4, 5, 6]
nums.insert(3, 99) # 在索引 3 处插入
print(nums) # [0, 1, 2, 99, 3, 4, 5, 6]

3.2 删除元素

nums = [10, 20, 30, 20, 40]

# 4. remove(x) —— 移除第一个匹配值
nums.remove(20)
print(nums) # [10, 30, 20, 40] 只删除了第一个 20

# 5. pop([i]) —— 移除并返回指定索引的元素(默认最后)
last = nums.pop()
print(last) # 40
print(nums) # [10, 30, 20]
second = nums.pop(1)
print(second) # 30
print(nums) # [10, 20]

# 6. clear() —— 清空所有元素
nums.clear()
print(nums) # []

# 7. del 语句 —— 按索引或切片删除(不是方法,但常用)
lst = [1, 2, 3, 4, 5]
del lst[1] # 删除索引 1
print(lst) # [1, 3, 4, 5]
del lst[1:3] # 删除切片
print(lst) # [1, 5]

3.3 查找与统计

nums = [10, 20, 30, 20, 40]

# 8. index(x[, start[, end]]) —— 返回第一个匹配值的索引
print(nums.index(20)) # 1 第一个 20 在索引 1
print(nums.index(20, 2)) # 3 从索引 2 开始找,在索引 3 找到
# nums.index(99) # ValueError: 99 is not in list

# 9. count(x) —— 统计元素出现次数
print(nums.count(20)) # 2
print(nums.count(99)) # 0

# 10. len(list) —— 获取列表长度(内置函数,不是方法)
print(len(nums)) # 5

# 11. x in list / x not in —— 成员检查(运算符)
print(30 in nums) # True
print(99 not in nums) # True

3.4 排序与反转

# 12. sort(key=None, reverse=False) —— 原地排序
nums = [3, 1, 4, 1, 5, 9, 2]
nums.sort()
print(nums) # [1, 1, 2, 3, 4, 5, 9]

nums.sort(reverse=True)
print(nums) # [9, 5, 4, 3, 2, 1, 1]

# 自定义排序 key
words = ["apple", "banana", "kiwi", "cherry"]
words.sort(key=len) # 按长度排序
print(words) # ['kiwi', 'apple', 'banana', 'cherry']

words.sort(key=lambda s: s[1]) # 按最后一个字符排序
print(words) # ['banana', 'apple', 'kiwi', 'cherry']

# 13. reverse() —— 原地反转
nums = [1, 2, 3, 4]
nums.reverse()
print(nums) # [4, 3, 2, 1]

# 14. sorted(list) —— 返回新排序列表,原列表不变
nums = [3, 1, 2]
new = sorted(nums)
print(new) # [1, 2, 3]
print(nums) # [3, 1, 2] 原列表不变

3.5 复制与转换

# 15. copy() —— 浅拷贝
nums = [1, 2, [3, 4]]
shallow = nums.copy()
shallow[0] = 99
shallow[2][0] = 88 # 嵌套列表的修改会影响原列表
print(nums) # [1, 2, [88, 4]] 内层被影响!
print(shallow) # [99, 2, [88, 4]]

# 切片也是一种浅拷贝方式
nums2 = nums[:]

# 深拷贝需要 import copy 模块
import copy
nums = [1, 2, [3, 4]]
deep = copy.deepcopy(nums)
deep[2][0] = 88
print(nums) # [1, 2, [3, 4]] 原列表完全不受影响

# 16. + 拼接 —— 生成新列表
a = [1, 2]
b = [3, 4]
c = a + b
print(c) # [1, 2, 3, 4]
print(a) # [1, 2] 不变

# 17. * 重复 —— 生成新列表
print([0] * 3) # [0, 0, 0]
print([1, 2] * 2) # [1, 2, 1, 2]

# 18. join() 与 split() —— 列表与字符串互转
words = ["Hello", "World", "Python"]
sentence = " ".join(words)
print(sentence) # Hello World Python

chars = list("abc") # 字符串转字符列表
print(chars) # ['a', 'b', 'c']

3.6 列表推导式

# 基础推导式
squares = [x**2 for x in range(10) if x % 2 == 0]
print(squares) # [0, 4, 16, 36, 64]

# 嵌套推导式:展平二维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
print(flat) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# if-else 推导式
labels = ["even" if x % 2 == 0 else "odd" for x in range(5)]
print(labels) # ['even', 'odd', 'even', 'odd', 'even']


四、总结与速查

4.1 全部方法速查表

方法说明返回值是否原地时间复杂度
append(x) 尾部追加一个元素 None O(1)
extend(iter) 尾部追加多个元素 None O(k)
insert(i, x) 在索引 i 处插入 None O(n)
remove(x) 移除第一个匹配值 None O(n)
pop([i]) 移除并返回索引 i 的元素 被移除的元素 O(n) 中间,O(1) 末尾
clear() 清空列表 None O(1)
index(x) 返回第一个匹配值索引 int O(n)
count(x) 统计出现次数 int O(n)
sort(key, rev) 原地排序 None O(n log n)
reverse() 原地反转 None O(n)
copy() 浅拷贝 新列表 O(n)
len(list) 获取长度 int O(1)
x in list 成员检查 bool O(n)
x not in list 非成员检查 bool O(n)
sorted(list) 返回排序后新列表 新列表 O(n log n)
list + list 拼接生成新列表 新列表 O(n+m)
list * n 重复生成新列表 新列表 O(n*k)
list(iter) 从可迭代对象创建 新列表 O(n)

4.2 常见坑点

坑点错误示例正确做法
[[]] * n 共享引用 m = [[]] * 3; m[0].append(1) 三个都变了 m = [[] for _ in range(3)]
遍历时修改列表 for x in lst: lst.remove(x) 倒序删除或使用列表推导式
切片浅拷贝 b = a[:]; b[0][0]=99 影响 a 嵌套列表用 copy.deepcopy
remove 只删第一个 [1,2,1].remove(1) 剩下 [2,1] 循环删除或列表推导式 [x for x in lst if x != 1]
index 找不到报错 [1,2].index(3) ValueError 先 if x in lst: 判断
sort vs sorted 混淆 期望返回新列表却原地排序 sort() 原地不返回,sorted() 返回新列表

4.3 一句话总结

列表是 Python 的万能容器:用索引和切片定位位置,用 append/extend/pop/remove 增删内容,用 sort/reverse/copy 整理数据,用列表推导式一行写完循环逻辑。


你在列表操作中踩过哪些坑?或者还有哪些好用但不常见的方法?欢迎在评论区分享交流!如果觉得本文有帮助,不妨点赞收藏支持一下。


本文已收录到 Python 系列教程。上一篇:Python 字符串操作完全指南

赞(0)
未经允许不得转载:171主机测评 » 【Python 列表操作:定义、索引、切片、遍历常用方法,一篇搞定!】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址