Python 中操作列表完全指南
本文档面向零基础新手,详细讲解 遍历列表、用 range() 创建数值列表、简单统计、列表解析、切片与复制 以及常见错误与注意事项,并配有大量示例。
第一部分:操作列表与遍历整个列表
一、操作列表是什么?
操作列表 指的是对列表做各种处理:逐个访问元素、按条件生成新列表、取一段、复制等。最基础的一种就是 遍历整个列表——把列表里的元素一个一个拿出来处理。
二、遍历整个列表 —— for 循环
遍历 就是“从头到尾走一遍”,对每个元素做同样或类似的操作。在 Python 里用 for … in 列表 实现。
基本写法:
for 变量 in 列表:
缩进的代码块(会针对每个元素执行一次)
示例:
fruits = ["苹果", "香蕉", "橙子"]
for f in fruits:
print(f)
# 输出:
# 苹果
# 香蕉
# 橙子
说明:
f是循环变量,第一次是 “苹果”,第二次是 “香蕉”,第三次是 “橙子”- 冒号
:和缩进不能少,循环体必须比for多缩进一层(通常 4 个空格)
再示例:对每个元素做运算
nums = [1, 2, 3, 4]
for n in nums:
print(n * 2)
# 输出:2 4 6 8
带下标的遍历:用 enumerate()(了解)
若既要元素又要索引,可用 enumerate(列表):
names = ["小明", "小红", "小刚"]
for i, name in enumerate(names):
print(i, name)
# 0 小明
# 1 小红
# 2 小刚
第二部分:range() 与创建数值列表
三、Python 函数 range()
range() 用来生成一串整数,常用于循环次数或生成数字序列。
注意:range 得到的是“范围对象”,不是列表;要得到列表需用 list(range(…))。
三种用法:
| 写法 | 含义 | 示例 |
|---|---|---|
| range(stop) | 从 0 到 stop-1,步长 1 | range(5) → 0,1,2,3,4 |
| range(start, stop) | 从 start 到 stop-1,步长 1 | range(2,5) → 2,3,4 |
| range(start, stop, step) | 从 start 到 stop 前,步长 step | range(0,10,2) → 0,2,4,6,8 |
示例:
# range(5):0 到 4
print(list(range(5))) # [0, 1, 2, 3, 4]
# range(2, 6):2 到 5
print(list(range(2, 6))) # [2, 3, 4, 5]
# range(0, 10, 2):从 0 到 9,步长 2
print(list(range(0, 10, 2))) # [0, 2, 4, 6, 8]
# 步长可为负(从大到小)
print(list(range(5, 0, -1))) # [5, 4, 3, 2, 1]
重要: range 的“终点”不包含在结果里。例如 range(5) 只有 0,1,2,3,4,没有 5。
四、使用 range() 创建数字列表
把 list() 套在 range() 外面,就得到由这些数字组成的列表。
# 0 到 4
nums = list(range(5))
print(nums) # [0, 1, 2, 3, 4]
# 2 到 9
nums = list(range(2, 10))
print(nums) # [2, 3, 4, 5, 6, 7, 8, 9]
# 偶数:0, 2, 4, ..., 8
evens = list(range(0, 10, 2))
print(evens) # [0, 2, 4, 6, 8]
# 1 到 10
one_to_ten = list(range(1, 11))
print(one_to_ten) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
结合循环先建空列表再 append:
squares = []
for x in range(1, 6):
squares.append(x ** 2)
print(squares) # [1, 4, 9, 16, 25]
第三部分:对数字列表执行简单的统计计算
Python 内置了三个常用函数,对数字列表做简单统计:
| 函数 | 作用 | 示例 |
|---|---|---|
| min(列表) | 最小值 | min([1,3,2]) → 1 |
| max(列表) | 最大值 | max([1,3,2]) → 3 |
| sum(列表) | 所有元素之和 | sum([1,2,3]) → 6 |
示例:
nums = [3, 1, 4, 1, 5]
print(min(nums)) # 1
print(max(nums)) # 5
print(sum(nums)) # 14
求平均值:
nums = [80, 90, 85, 88]
total = sum(nums)
count = len(nums)
avg = total / count
print(avg) # 85.75
# 或一行:avg = sum(nums) / len(nums)
注意: min、max、sum 要求列表非空,且元素之间要能比较(数字列表没问题)。空列表会报错。
# min([]) # ValueError
第四部分:列表解析(列表推导式)
五、什么是列表解析?
列表解析(列表推导式)是用一行写“按某种规则从原列表或 range 生成新列表”的语法,形式为:
[ 表达式 for 变量 in 可迭代对象 ]
还可以加条件:
[ 表达式 for 变量 in 可迭代对象 if 条件 ]
示例:用 range 生成平方数列表
# 不用列表解析:循环 + append
squares = []
for x in range(1, 6):
squares.append(x ** 2)
# 用列表解析:一行
squares = [x ** 2 for x in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
再示例:从已有列表生成新列表
nums = [1, 2, 3, 4]
doubled = [n * 2 for n in nums]
print(doubled) # [2, 4, 6, 8]
带条件的列表解析:
# 只要偶数
nums = [1, 2, 3, 4, 5, 6]
evens = [n for n in nums if n % 2 == 0]
print(evens) # [2, 4, 6]
# 从 1 到 10 中,只要大于 5 的数的平方
squares_big = [x ** 2 for x in range(1, 11) if x > 5]
print(squares_big) # [36, 49, 64, 81, 100]
六、列表解析常见错误与注意事项
1. 忘记写方括号
列表解析必须写在 [] 里,否则变成“生成器表达式”,类型不是 list。
# 错误:没有 [],得到的是生成器对象
# s = x ** 2 for x in range(5) # 语法错误
# 正确
s = [x ** 2 for x in range(5)]
2. 循环变量名和表达式写错
确保 for 变量 in … 里的变量名和 表达式 里用的一致。
# 错误:表达式里写了 y,循环变量是 x
# bad = [y * 2 for x in range(5)]
# 正确
good = [x * 2 for x in range(5)]
3. 可读性
列表解析写得太长、逻辑太复杂时,可读性会变差,可以拆成普通 for 循环。
4. 不要在同一列表解析里依赖“刚写进去的值”
列表解析是“先算完再组成列表”,不要在表达式里指望前面元素已经改变列表。
# 不推荐:逻辑容易混乱
# 推荐:逻辑简单、一目了然时用列表解析
5. 空列表
若条件永远不满足,会得到空列表:
lst = [x for x in range(5) if x > 10]
print(lst) # []
第五部分:切片、遍历切片、复制列表
七、Python 的切片
切片 用来取列表的一段,得到新列表。格式:
列表[开始:结束] # 从“开始”到“结束”前一个(不包含结束)
列表[开始:结束:步长] # 可选步长
- 不写开始:从索引 0 开始
- 不写结束:到末尾
- 步长:不写默认为 1;为负时从右往左取
示例:
nums = [10, 20, 30, 40, 50]
print(nums[1:4]) # [20, 30, 40](索引 1 到 3)
print(nums[:3]) # [10, 20, 30](前 3 个)
print(nums[2:]) # [30, 40, 50](从索引 2 到末尾)
print(nums[-3:]) # [30, 40, 50](最后 3 个)
print(nums[::2]) # [10, 30, 50](步长 2,隔一个取一个)
print(nums[::-1]) # [50, 40, 30, 20, 10](反转)
注意: 切片不修改原列表,总是得到新列表(或空列表)。
八、遍历切片
可以对切出来的那段做 for 循环,而不是整个列表。
fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
# 只遍历前 3 个
for f in fruits[:3]:
print(f)
# 苹果 香蕉 橙子
# 只遍历最后 2 个
for f in fruits[-2:]:
print(f)
# 葡萄 西瓜
示例:对“前一半”元素求和
nums = [10, 20, 30, 40]
half = len(nums) // 2
for n in nums[:half]:
print(n) # 10 20
九、复制列表
若直接写 b = a,b 和 a 指向同一个列表,改一个另一个也会变。
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]
print(b) # [1, 2, 3, 4]
方法二:用 .copy()
a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a) # [1, 2, 3]
print(b) # [1, 2, 3, 4]
方法三:用 list()
a = [1, 2, 3]
b = list(a)
b.append(4)
print(a) # [1, 2, 3]
print(b) # [1, 2, 3, 4]
注意: 以上都是浅拷贝。若列表里还有子列表,子列表仍是“共享”的;需要完全独立副本时要用到“深拷贝”(copy.deepcopy),初学可先掌握浅拷贝。
第六部分:综合示例与小结
十、综合示例
# 1. 遍历列表
for x in [1, 2, 3]:
print(x)
# 2. range 与数值列表
nums = list(range(1, 6))
print(nums) # [1, 2, 3, 4, 5]
# 3. 统计
print(min(nums), max(nums), sum(nums))
# 4. 列表解析
squares = [x ** 2 for x in range(1, 6)]
evens = [x for x in nums if x % 2 == 0]
# 5. 切片与遍历切片
print(nums[1:4])
for n in nums[:3]:
print(n)
# 6. 复制
copy_nums = nums[:]
十一、小结表
| 内容 | 要点 |
|---|---|
| 遍历列表 | for 变量 in 列表: 逐个处理元素 |
| range() | range(stop)、range(start,stop)、range(start,stop,step);不包含 stop |
| 数值列表 | list(range(…)) 或 循环 append |
| 统计 | min(列表)、max(列表)、sum(列表) |
| 列表解析 | [表达式 for 变量 in 可迭代对象] 或加 if 条件 |
| 切片 | 列表[开始:结束]、列表[开始:结束:步长];得到新列表 |
| 遍历切片 | for 变量 in 列表[开始:结束]: |
| 复制列表 | b = a[:] 或 b = a.copy() 或 b = list(a),不要用 b = a |