08.Python中操作列表完全指南

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 = aba 指向同一个列表,改一个另一个也会变。

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

发表评论