当前位置:首页>python>【Python小白入门指南】第三期 ·Python列表与序列:数据管理的"收纳箱"

【Python小白入门指南】第三期 ·Python列表与序列:数据管理的"收纳箱"

  • 2026-10-10 22:10:15
【Python小白入门指南】第三期 ·Python列表与序列:数据管理的"收纳箱"

写在前面

在编程中,我们经常需要处理一堆数据——比如一个班的成绩、一周的温度、购物车的商品……

如果每个数据都用一个变量存,那得写多少变量?30个学生就要写30个变量?这显然不合理。

Python给了我们一个解决方案:序列(Sequence)。

你可以把序列理解成一个带编号的收纳箱,每个格子都有编号(索引),可以按编号存取东西。


一、认识序列

1.1 序列有哪些?

Python中最常用的序列类型:

类型
特点
例子
列表(list)
可变,最常用
[1, 2, 3]
元组(tuple)
不可变
(1, 2, 3)
字符串(str)
不可变,字符序列
"hello"

💡 一句话理解:序列就是"有顺序的一排数据",每个数据都有自己固定的位置编号。

1.2 索引:数据的"门牌号"

序列中每个元素的位置编号叫做索引,从 0 开始:

字符串 "helloCoCo"正向索引:  h     e     l     l     o     C     o     C     o            0     1     2     3     4     5     6     7     8负向索引: -9    -8    -7    -6    -5    -4    -3    -2    -1
s = "helloCoCo"print(s[0])     # h,第一个元素print(s[-1])    # o,最后一个元素print(s[100])   # 报错!IndexError: string index out of range

⚠️ 注意:

  • 索引从 0 开始,不是从1开始
  • 最大正向索引 = 长度 - 1
  • 负向索引中,-1 表示最后一个元素
  • 索引不能越界,否则会报错

1.3 切片:批量取数据

切片是从序列中"截取一段",语法是 s[起始:结束]:

s = "helloCoCo"print(s[:2])     # he,从开头取到索引2(不包含2)print(s[2:])     # lloCoCo,从索引2取到末尾print(s[2:5])    # llo,从索引2取到索引5(不包含5)print(s[-3:])    # CoCo,取最后3个print(s[::2])    # hlooC,每隔一个取一个

💡 记忆技巧:s[起始:结束:步长],结束位置取不到,就像排队说"到5号为止"意思是排到4号。


二、序列通用操作

2.1 遍历序列

for循环遍历(推荐):

s = "helloCoCo"for val in s:    print(val)# 输出:h e l l o C o C o(每个字符一行)
while循环遍历:
s = "helloCoCo"i = 0while i < len(s):    print(s[i])    i += 1

2.2 序列运算符

# 比较运算符(按字典序逐个比较)print([1, 2, 3] < [1, 2, 4])  # True# not 判断是否为空print(not [])    # True,空列表被视为Falseprint(not [1])   # False# 加法(拼接)print([1, 2] + [3, 4])    # [1, 2, 3, 4]print("hello" + "world")  # helloworld# 乘法(重复)print([1] * 3)    # [1, 1, 1]print("ha" * 3)   # hahaha

2.3 常用序列函数

函数
说明
示例
len()
获取长度
len("hello")
 → 5
max()
获取最大值
max([3, 1, 2])
 → 3
min()
获取最小值
min([3, 1, 2])
 → 1
sum()
求和
sum([1, 2, 3])
 → 6
in
判断元素是否存在
3 in [1, 2, 3]
 → True
sorted()
排序
sorted([3,1,2])
 → [1, 2, 3]
all()
全部为真才返回True
all([1, 2, 0])
 → False
any()
有一个为真就返回True
any([0, 0, 1])
 → True
zip()
合并多个序列
list(zip([1,2],[3,4]))
 → [(1,3),(2,4)]

2.4 理解 key 参数

max() 和 min() 的 key 参数非常实用:

vals = [1, -10, 3, -11, 8, -3]# 直接取最大值print(max(vals))                    # 8# 取绝对值最大的值print(max(vals, key=abs))           # -11# 在字符串列表中,按数字大小取最大值listnum = ['200', '798', '1000']print(max(listnum, key=int))        # '1000'

key 的工作原理:

  1. 先用 key 函数处理每个元素
  2. 根据处理后的结果选最大/最小值
  3. 返回的是原始元素
    ,不是处理后的值

三、列表:最强大的"收纳箱"

3.1 什么是列表?

列表是 Python 中最常用的数据结构,你可以把它理解为一个可以随时增删改的盒子:

# 列表可以存放任何类型的数据l = [1, "hello", 3.14, True, None]print(l)  # [1, 'hello', 3.14, True, None]# 甚至可以放列表(二维列表)matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

3.2 创建列表

# 方式1:直接定义list1 = [1, '1', '2', 3]# 方式2:使用 list() 函数s = "qimao"tmp = list(s)print(tmp)         # ['q', 'i', 'm', 'a', 'o']# 字符串列表转回字符串print("".join(tmp)) # 'qimao'

3.3 遍历二维列表

scores = ["class_1", ["sun", 80, 60], ["zhao", 70, 90]]for item in scores:    if isinstance(item, list):    # 判断是不是列表        for val in item:            print(val)    else:        print(item)# 输出:# class_1# sun# 80# 60# zhao# 70# 90

3.4 修改列表元素

列表是可变的,可以直接修改某个位置的值:

scores = [60, 90, 59]scores[1] = 62print(scores)  # [60, 62, 59]
实战:把成绩中的 -1 替换为 0
a = [96, 80, -1, 66]for index, val in enumerate(a):    if val == -1:        a[index] = 0print(a)  # [96, 80, 0, 66]

💡 enumerate() 函数:同时获取索引和值,比手动维护索引变量方便得多。


四、列表增删改查

4.1 添加元素

l = [1, 2, 3]# append:尾部添加一个元素l.append(4)print(l)   # [1, 2, 3, 4]# insert:在指定位置插入l.insert(0, -1)print(l)   # [-1, 1, 2, 3, 4]# extend:尾部添加多个元素l.extend([5, 6])print(l)   # [-1, 1, 2, 3, 4, 5, 6]# 也可以 extend 字符串(会把字符串拆成单个字符)l.extend("789")print(l)   # [-1, 1, 2, 3, 4, 5, 6, '7', '8', '9']

4.2 统计与查找

l = [1, 2, 3, 4, 3, 5, 3]# count:统计出现次数print(l.count(3))           # 3,出现了3次# index:查找第一次出现的位置print(l.index(3))           # 2,第一次出现在索引2# index 也可以指定搜索范围print(l.index(3, 3))        # 4,从索引3之后找,第一次出现在4

4.3 删除元素

l = [1, 4, 2, 4, 3, 4]# pop:删除指定位置的元素,并返回该元素l.pop()         # 删除最后一个,返回4print(l)        # [1, 4, 2, 4, 3]l.pop(0)        # 删除第一个,返回1print(l)        # [4, 2, 4, 3]# remove:删除第一个匹配的值l.remove(4)     # 删除第一个4print(l)        # [2, 4, 3]# clear:清空列表l.clear()print(l)        # []

4.4 ⚠️ 列表删除的"陷阱"

问题:遍历时删除元素,可能会遗漏!

vals = [1, 2, 3, 4, 4, 5, 4, 5, 6]# ❌ 错误写法:删除时列表在变化,会跳过某些元素for val in vals:    if vals.count(val) > 1:        vals.remove(val)print(vals)  # [1, 2, 3, 4, 4, 5, 6] —— 没删干净!
正确写法:反复检查直到没有重复
vals = [1, 2, 1, 2, 3, 4, 4, 5, 4, 5, 6]# ✅ 正确写法:用 while 循环反复去重while True:    for item in vals:        if vals.count(item) > 1:            vals.remove(item)            break    else:        break  # for循环没被break中断,说明没有重复了print(vals)  # [1, 2, 3, 4, 5, 6]

⚠️ 核心教训:在遍历列表时不要直接删除元素,这会导致索引错位。推荐用列表解析或创建新列表的方式处理。


五、元组:不可变的"收纳箱"

5.1 什么是元组?

元组和列表很像,但有一个关键区别:元组不可变。

# 创建元组t1 = (1, 2, 3)t2 = 1, 2, 3       # 省略括号也可以t3 = tuple("1234") # ('1', '2', '3', '4')t4 = tuple([1,2,3,4]) # (1, 2, 3, 4)# 元组解包赋值a, b, c = (1, 2, 3)print(a, b, c)  # 1 2 3

5.2 为什么需要元组?

t = (1, 2, 3)t[0] = -1  # 报错!TypeError: 'tuple' object does not support item assignment
场景
用列表
用元组
数据需要修改
✅
❌
数据不需要修改
可以
✅ 更安全
作为字典的键
❌
✅
性能要求高
可以
✅ 略快

💡 简单理解:如果你确定数据不会被修改,就用元组,它比列表更安全、更快。

5.3 元组常用方法

元组只有两个方法(因为不能修改嘛):

t = (1, 2, 3, 2, 2)print(t.count(2))    # 3,2出现了3次print(t.index(3))    # 2,3第一次出现在索引2

六、列表解析:Python的"魔法语法"

6.1 什么是列表解析?

列表解析是 Python 中创建列表的简洁写法,一行代码就能完成多行循环的工作。

基本语法:

[表达式 for 变量 in 可迭代对象]

6.2 基础用法

# 生成 [1, 2, 3, 4, 5]print([val for val in range(1, 6)])# 生成 [1, 4, 9, 16, 25](每个数的平方)print([val ** 2 for val in range(1, 6)])# 生成 ['0', '1', '2', '3', '4', '5'](数字转字符串)print([str(val) for val in range(0, 6)])# 520 → [5, 2, 0]print([int(val) for val in str(520)])# 生成10个随机数import randomprint([random.randint(1, 100) for i in range(10)])

💡 对比一下:用传统循环要写4行,列表解析只需1行,简洁又优雅!

6.3 带条件的列表解析

语法:

[表达式 for 变量 in 可迭代对象 if 条件]
# 1~100之间的偶数evens = [val for val in range(1, 101) if val % 2 == 0]print(evens)  # [2, 4, 6, 8, ..., 100]# 过滤及格的成绩scores = [59, 100, 20, 30, 80]passed = [score for score in scores if score >= 60]print(passed)  # [100, 80]# 统计每段歌词中每个单词的长度lyrics = """When I was young I'd listen to the radioWaiting for my favorite songsWhen they played I'd sing along,It made me smile."""word_len = [len(word) for word in lyrics.split()]print(word_len)    # [4, 1, 3, 5, 3, 6, 2, 3, 5, ...]print(sum(word_len))  # 98,总字符数

6.4 多重循环的列表解析

语法:

[表达式 for 变量1 in 序列1 for 变量2 in 序列2]
# 两个列表的两两组合result = [(v1, v2) for v1 in range(1, 4) for v2 in range(1, 4)]print(result)# [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]# 两两乘积products = [v1 * v2 for v1 in range(1, 4) for v2 in range(1, 4)]print(products)  # [1, 2, 3, 2, 4, 6, 3, 6, 9]

6.5 用列表解析写乘法口诀表

result = [f"{j}*{i}={i*j}" for i in range(1, 10) for j in range(1, 10) if i >= j]print(result)# ['1*1=1', '1*2=2', '2*2=4', '1*3=3', '2*3=6', '3*3=9', ...]

💡 这行代码就生成了完整的乘法口诀表!i >= j 确保了不重复(比如只有2×3,没有3×2)。


七、实战练习

练习1:有序列表插入元素

在有序列表中插入数字,保持列表有序:

def insert_value(listnum):    while True:        val = input("输入数字(输入q退出):")        if val == "q":            break        val = int(val)        for index, item in enumerate(listnum):            if val <= item:                listnum.insert(index, val)                break        else:            listnum.append(val)  # 比所有元素都大,加到末尾        print(listnum)listn = [1, 2, 3]insert_value(listn)

练习2:数字转数字列表

def num_to_list(num):    result = []    for value in str(num):        result.append(int(value))    return resultprint(num_to_list(320))   # [3, 2, 0]print(num_to_list(9527))  # [9, 5, 2, 7]

练习3:合并两个有序列表

不用排序函数,手动合并两个有序列表:

八、知识总结


写在最后

列表是 Python 中最重要的数据结构,没有之一。

掌握列表,你就掌握了数据管理的基本能力。无论是处理成绩单、分析数据,还是开发应用,列表都是你的得力助手。

记住几个关键点:

  1. 索引从 0 开始,-1 是最后一个元素
  2. 切片是"左闭右开"的,s[2:5] 取到索引4
  3. 列表可变,元组不可变
  4. 遍历时不要直接删除元素
  5. 列表解析让代码更简洁优雅

下篇文章我们将学习字符串的更多用法。

觉得有用的话,点个赞👍,有问题欢迎评论区交流!


本文基于Python 3.8+编写,如有疑问欢迎交流讨论。

最新文章

随机文章