Python语言基础:10_列表
Python3 列表超详细新手教程(全示例 + 逐点讲解 + 避坑指南)
列表(list)是 Python 中最常用的有序可变容器,可以一次性存储多个不同类型的数据,相当于一个 “能随时增减、修改内容的有序货架”。它是后续学习循环、数据处理的基础,本文从零开始逐点讲解,所有代码都可直接复制运行验证。
一、什么是列表?怎么定义?
1. 基础语法
列表用英文方括号[]包裹,内部多个元素用英文逗号,分隔,元素可以是数字、字符串、布尔值,甚至另一个列表。
2. 基础示例
# 存储同类型数据:多个名字 names = ["小明", "小红", "小刚"] # 存储混合类型数据:数字、字符串、布尔值 mix_list = [100, "Python", True, 3.14] # 空列表(后续动态添加数据用) empty_list = [] print(names) print(type(names)) # 查看类型:<class 'list'>3. 列表核心特点(新手必记)
- 有序:元素有固定顺序,每个位置有专属索引(下标)
- 可变:可以随时修改、添加、删除元素(和字符串核心区别)
- 可重复:同一个值可以出现多次
- 支持多类型:同一个列表可以放不同类型的数据
二、列表的索引(下标取值 / 改值)
和字符串一样,列表每个元素都有索引编号,通过索引可以取值、改值。
核心规则
- 正向索引:从左往右,从
0开始编号 - 反向索引:从右往左,从
-1开始编号 - 索引超出范围会直接报错(新手高频错误)
- ✅ 列表可以通过索引修改元素(字符串不行,这是核心差异)
示例演示
fruits = ["苹果", "香蕉", "橙子", "西瓜", "葡萄"] # 元素: 苹果 香蕉 橙子 西瓜 葡萄 # 正向: 0 1 2 3 4 # 反向: -5 -4 -3 -2 -1 # 1. 通过索引取值 print(fruits[0]) # 苹果(第一个元素) print(fruits[2]) # 橙子 print(fruits[-1]) # 葡萄(最后一个元素) print(fruits[-2]) # 西瓜 # 2. 通过索引修改元素(列表可变,字符串不能这么做) fruits[1] = "芒果" print(fruits) # ['苹果', '芒果', '橙子', '西瓜', '葡萄']❌ 新手易错:索引越界
列表长度为 5,最大正向索引是 4,写fruits[5]会直接报错:
print(fruits[5]) # 报错:IndexError: list index out of range三、列表的切片(截取子列表)
切片就是从列表中截取一段连续的元素,生成一个新列表,语法规则和字符串切片完全一致。
语法格式
列表[起始索引:结束索引:步长]核心规则
- 左闭右开:包含起始索引元素,不包含结束索引元素
- 参数可省略:
- 起始省略:默认从开头(索引 0)开始
- 结束省略:默认截取到末尾
- 步长省略:默认值为 1,挨个取
- 切片不会修改原列表,返回的是全新列表
基础示例
nums = [10, 20, 30, 40, 50, 60] # 截取索引1到4(包含1,不包含4) print(nums[1:4]) # [20, 30, 40] # 省略起始:从开头到索引3 print(nums[:3]) # [10, 20, 30] # 省略结束:从索引2到末尾 print(nums[2:]) # [30, 40, 50, 60] # 全省略:复制整个列表 print(nums[:]) # [10, 20, 30, 40, 50, 60]带步长的切片
nums = [10, 20, 30, 40, 50, 60] # 步长为2:隔一个取一个 print(nums[::2]) # [10, 30, 50] # 步长为-1:反转列表 print(nums[::-1]) # [60, 50, 40, 30, 20, 10]四、列表的增删改查(核心重点)
4.1 改:修改指定位置元素
通过索引直接赋值即可,前面已经讲过,再巩固一次:
lst = ["a", "b", "c"] lst[0] = "A" print(lst) # ['A', 'b', 'c']4.2 增:添加元素
共 4 种常用方式,适用场景不同,新手重点区分append和extend。
| 方法 | 作用 | 特点 |
|---|---|---|
append(元素) | 末尾追加单个元素 | 最常用,一次加一个 |
extend(可迭代对象) | 末尾批量追加多个元素 | 把元素逐个拆开放进去 |
insert(索引, 元素) | 指定索引位置插入元素 | 后面元素自动后移 |
+ 号 | 拼接两个列表,生成新列表 | 原列表不变 |
① append () 末尾追加单个元素
lst = [1, 2, 3] lst.append(4) print(lst) # [1, 2, 3, 4] # 追加一个列表:会把整个列表当成一个元素 lst.append([5, 6]) print(lst) # [1, 2, 3, 4, [5, 6]]② extend () 批量追加元素
把传入的列表 / 字符串等拆成单个元素,逐个追加到末尾:
lst = [1, 2, 3] lst.extend([4, 5, 6]) print(lst) # [1, 2, 3, 4, 5, 6]⚠️ 新手必辨:append vs extend
- append:把参数当成一个整体加进去
- extend:把参数拆成多个元素逐个加进去
a = [1,2] a.append([3,4]) # 结果:[1,2,[3,4]] 长度+1 b = [1,2] b.extend([3,4]) # 结果:[1,2,3,4] 长度+2
③ insert () 指定位置插入
lst = ["a", "b", "c"] # 在索引1的位置插入"x",后面元素后移 lst.insert(1, "x") print(lst) # ['a', 'x', 'b', 'c']④ + 号拼接列表
生成全新列表,原两个列表都不变:
lst1 = [1, 2] lst2 = [3, 4] lst3 = lst1 + lst2 print(lst3) # [1, 2, 3, 4]4.3 删:删除元素
共 4 种常用方式,按索引删、按值删、清空,各有适用场景。
| 方法 / 语句 | 作用 | 特点 |
|---|---|---|
del 列表[索引] | 按索引删除指定元素 | 纯删除,无返回值 |
pop(索引) | 删除并返回被删元素 | 不写索引默认删最后一个;有返回值 |
remove(值) | 按值删除第一个匹配项 | 找不到会报错 |
clear() | 清空整个列表 | 变成空列表 |
① del 按索引删除
lst = [10, 20, 30, 40] del lst[1] # 删除索引1的元素20 print(lst) # [10, 30, 40]② pop () 删除并返回元素
lst = [10, 20, 30, 40] # 不写索引,默认删除最后一个 last = lst.pop() print(last) # 40(被删掉的元素) print(lst) # [10, 20, 30] # 指定索引删除 num = lst.pop(0) print(num) # 10 print(lst) # [20, 30]③ remove () 按值删除
lst = ["苹果", "香蕉", "苹果", "橙子"] lst.remove("苹果") # 删除第一个出现的"苹果" print(lst) # ['香蕉', '苹果', '橙子'] # 不存在的值会报错 # lst.remove("西瓜") # 报错:ValueError: list.remove(x): x not in list④ clear () 清空列表
lst = [1, 2, 3] lst.clear() print(lst) # []4.4 查:查找与统计
| 方法 / 函数 | 作用 | 返回值 |
|---|---|---|
元素 in 列表 | 判断元素是否存在 | True/False |
列表.index(元素) | 查找元素第一次出现的索引 | 索引值,找不到报错 |
列表.count(元素) | 统计元素出现次数 | 数字 |
len(列表) | 统计列表元素个数 | 数字 |
max(列表) | 求最大值 | 最大值 |
min(列表) | 求最小值 | 最小值 |
示例演示
nums = [10, 20, 30, 20, 50] # 1. 判断是否存在 print(20 in nums) # True print(99 in nums) # False # 2. 找元素索引 print(nums.index(30)) # 2 # print(nums.index(99)) # 找不到报错 # 3. 统计次数 print(nums.count(20)) # 2 # 4. 长度 print(len(nums)) # 5 # 5. 最值 print(max(nums)) # 50 print(min(nums)) # 10⚠️ 注意:
max()/min()要求列表元素类型一致,混合数字和字符串会报错。
五、列表常用操作方法
5.1 排序
两种排序方式,新手最容易搞混,务必分清。
① sort ():原地排序(修改原列表,无返回值)
直接对原列表排序,默认从小到大,没有返回值。
nums = [3, 1, 4, 2, 5] nums.sort() # 直接修改原列表 print(nums) # [1, 2, 3, 4, 5] # 倒序排序 nums.sort(reverse=True) print(nums) # [5, 4, 3, 2, 1]❌ 新手大坑:不要用变量接收 sort () 的结果
res = nums.sort() print(res) # None!sort没有返回值
② sorted ():返回新列表(原列表不变)
Python 内置函数,生成一个排序后的新列表,原列表保持不变。
nums = [3, 1, 4, 2, 5] new_nums = sorted(nums) print(new_nums) # [1, 2, 3, 4, 5](新列表) print(nums) # [3, 1, 4, 2, 5](原列表不变)5.2 反转列表 reverse ()
原地反转列表的顺序:
lst = ["a", "b", "c"] lst.reverse() print(lst) # ['c', 'b', 'a']5.3 列表复制(新手高频坑)
❌ 错误方式:直接赋值
直接赋值只是给同一个列表起了个别名,两个变量指向同一块内存,改一个另一个跟着变:
list1 = [1, 2, 3] list2 = list1 # 只是多了一个名字,还是同一个列表 list1[0] = 99 print(list2) # [99, 2, 3] list2也跟着变了✅ 正确复制方式
copy()方法
list1 = [1, 2, 3] list2 = list1.copy() list1[0] = 99 print(list2) # [1, 2, 3] 互不影响- 切片复制
list2 = list1[:] # 效果和copy()一样六、遍历列表(循环逐个处理元素)
遍历就是把列表里的元素一个一个取出来处理,是循环最常用的场景。
方式 1:直接遍历元素(最常用)
适合只需要元素值,不需要索引的场景:
fruits = ["苹果", "香蕉", "橙子"] for fruit in fruits: print(f"我喜欢吃{fruit}")输出:
我喜欢吃苹果 我喜欢吃香蕉 我喜欢吃橙子方式 2:遍历索引(range + len)
适合需要用到元素位置的场景:
fruits = ["苹果", "香蕉", "橙子"] for i in range(len(fruits)): print(f"第{i+1}个水果是:{fruits[i]}")方式 3:enumerate 同时取索引和值(拓展)
更简洁的写法,同时拿到索引和元素:
fruits = ["苹果", "香蕉", "橙子"] for index, fruit in enumerate(fruits): print(f"索引{index}:{fruit}")七、嵌套列表(二维列表)
列表里的元素也可以是列表,形成 “二维表格” 一样的结构,叫嵌套列表 / 二维列表。
1. 定义示例
# 3个学生,每个学生有3科成绩 scores = [ [90, 85, 95], # 第0个学生 [88, 92, 80], # 第1个学生 [75, 80, 98] # 第2个学生 ]2. 取值方法
两层索引,第一层取子列表,第二层取具体元素:
# 取第1个学生的第2科成绩 print(scores[1][2]) # 80 # 取第0个学生的第0科成绩 print(scores[0][0]) # 90八、拓展:列表推导式(快速生成列表)
一种简洁的生成列表的语法,适合用简单规则生成批量数据,新手先了解基础写法:
# 生成 0~9 的平方列表 # 普通写法 lst = [] for i in range(10): lst.append(i**2) # 列表推导式写法 lst = [i**2 for i in range(10)] print(lst) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]九、新手高频易错点总结
- 索引越界:索引从 0 开始,最大索引 = 长度 - 1,超出会报错
- append 和 extend 混淆:append 加整体,extend 拆成逐个元素
- 用变量接收 sort () 结果:sort 原地修改,返回 None;sorted 才返回新列表
- 直接赋值复制列表:
list2 = list1会联动修改,要用copy()或切片 - remove 删除不存在的值:会报错,删除前建议先用
in判断是否存在 - 混合类型求最值:
max()/min()要求元素类型一致,不能数字字符串混用 - 索引修改字符串:只有列表能通过索引改值,字符串不行,不要搞混
