Skip to content

容器的公共操作 ​

学生名单可能暂时保存在列表中,成绩可能保存在元组中,配置信息也可能使用字典保存。面对这些不同的容器,如何合并数据、判断成员、统计数量,并在遍历时显示序号?

这些需求不应该为每种容器分别记一套写法。字符串、列表、元组、字典和集合虽然结构不同,但有一组可以复用的公共操作。本节围绕这组问题整理运算符和工具,并在最后完成一次学生名单处理。

公共运算符 ​

先看跨容器可复用的四个运算符,再根据数据类型确认它们的适用范围。

运算符作用常见支持类型
+拼接两个容器字符串、列表、元组
*重复容器中的内容字符串、列表、元组
in判断元素是否存在字符串、列表、元组、字典、集合
not in判断元素是否不存在字符串、列表、元组、字典、集合

容器公共运算符支持矩阵与字典检索分流图

拼接与重复 ​

两个小组名单需要合并,或一条分隔线需要重复输出时,可以先判断目标是拼接还是重复。

拼接: + 可以拼接两个相同类型的字符串、列表或元组:

python
# 拼接字符串
text1 = "Python"
text2 = "基础课"
print(text1 + text2)

# 拼接列表
group1 = ["张三", "李四"]
group2 = ["王五", "赵六"]
print(group1 + group2)

# 拼接元组
scores1 = (88, 92)
scores2 = (85,)
print(scores1 + scores2)

运行结果:

text
Python基础课
['张三', '李四', '王五', '赵六']
(88, 92, 85)

注意,+ 两边的容器类型必须一致。列表不能直接和元组拼接。

重复: * 可以把字符串、列表或元组中的内容重复指定次数:

python
print("-" * 10)
print(["Python"] * 3)
print((100,) * 3)

运行结果:

text
----------
['Python', 'Python', 'Python']
(100, 100, 100)

这里的“重复”会生成一个新容器,不会修改原容器。

注意嵌套的可变对象

如果列表中保存的是列表或字典,使用 * 重复后,内部对象可能仍然被共享。这和上一节的对象引用问题相同。

重复运算与嵌套浅拷贝共享陷阱图

成员判断 ​

名单查询首先要回答“某个值是否存在”。in 判断元素是否存在,not in 判断元素是否不存在:

python
names = ["张三", "李四", "王五"]

print("张三" in names)
print("赵六" not in names)
print("Py" in "Python")
print(90 in (88, 90, 95))
print(60 in {60, 70, 80})

运行结果:

text
True
True
True
True
True

如果操作的是字典,in 和 not in 判断的是键,不是值:

python
student = {"name": "张三", "age": 18}

print("name" in student)
print("张三" in student)
print("张三" in student.values())

运行结果:

text
True
False
True

公共工具 ​

完成名单统计和遍历,还需要处理长度、删除、极值、序列和序号等问题。下面按使用场景合并介绍这些工具。

写法作用
len()统计元素个数
del删除变量或容器中的元素
max()返回最大值
min()返回最小值
range(start, stop, step)按规律生成整数序列
enumerate(iterable, start=0)遍历时同时获得序号和元素

其中,del 是关键字,不是函数。其他几个都是 Python 提供的内置函数。

长度、删除与比较 ​

统计人数、删除指定数据和比较成绩时,分别使用以下工具。

常用内置工具全容器行为全景矩阵图

长度统计: len() 返回容器中的元素个数:

python
print(len("Python"))
print(len([10, 20, 30, 40]))
print(len((10, 20, 30, 40)))
print(len({10, 20, 30}))
print(len({"name": "张三", "age": 18}))

运行结果:

text
6
4
4
3
2

字典的长度是键值对的数量,集合的长度是不重复元素的数量。

删除内容: del 可以删除变量,也可以删除容器中的指定元素。

删除列表中的第一个元素:

python
names = ["张三", "李四", "王五"]
del names[0]
print(names)

运行结果:

text
['李四', '王五']

删除变量后,这个变量名就不能继续使用:

python
name = "张三"
del name
print(name)

运行到 print(name) 时会出现 NameError,因为变量 name 已经不存在。

极值比较: max() 返回最大值,min() 返回最小值:

python
scores = [88, 92, 85, 96]

print(max(scores))
print(min(scores))
print(max("abcdefg"))
print(min("abcdefg"))

运行结果:

text
96
85
g
a

字符串会按照字符的编码顺序比较。初学阶段,max() 和 min() 主要用来处理数字容器。

序列生成与序号遍历 ​

需要按规律生成编号,或在遍历名单时同时拿到位置和内容时,使用这一组工具。

序列生成: range() 常和 for 循环一起使用。它有三种常见写法:

python
# 只设置结束位置:从 0 开始,到 5 之前结束
for number in range(5):
    print(number, end=" ")

print()

# 设置开始和结束位置
for number in range(1, 5):
    print(number, end=" ")

print()

# 再设置步长
for number in range(1, 6, 2):
    print(number, end=" ")

运行结果:

text
0 1 2 3 4
1 2 3 4
1 3 5

可以这样记:

python
range(start, stop, step)
  • start:开始位置,默认是 0
  • stop:结束位置,不包含这个数
  • step:每次增加的步长,默认是 1

range 区间标尺与 enumerate 双流装配流水线图

序号遍历: 直接遍历列表时,只能拿到元素:

python
names = ["张三", "李四", "王五"]

for name in names:
    print(name)

如果同时需要序号和元素,可以使用 enumerate():

python
names = ["张三", "李四", "王五"]

for item in enumerate(names):
    print(item)

for index, name in enumerate(names, start=1):
    print(f"序号:{index},姓名:{name}")

运行结果:

text
(0, '张三')
(1, '李四')
(2, '王五')
序号:1,姓名:张三
序号:2,姓名:李四
序号:3,姓名:王五

enumerate() 每次产生一个“序号和元素”组成的元组。start=1 表示序号从 1 开始;如果不设置,默认从 0 开始。

案例:输出学生名单 ​

前面的运算符和工具分别解决了合并、统计、判断和编号问题。现在将它们组合起来,完成一个学生名单处理案例。

案例需求如下:

  1. 合并两个小组的学生名单
  2. 输出学生总人数
  3. 判断“王五”是否在名单中
  4. 从 1 开始显示每名学生的序号

学生名单综合处理管道全景图

python
group1 = ["张三", "李四"]
group2 = ["王五", "赵六"]

students = group1 + group2

print(f"学生总人数:{len(students)}")
print(f"王五是否在名单中:{'王五' in students}")

for index, name in enumerate(students, start=1):
    print(f"{index}. {name}")

运行结果:

text
学生总人数:4
王五是否在名单中:True
1. 张三
2. 李四
3. 王五
4. 赵六

小结 ​

本节围绕四个问题组织了公共操作:

  1. 如何拼接或重复字符串、列表、元组?使用 + 和 *。
  2. 如何判断成员是否存在?使用 in 和 not in。
  3. 如何统计长度、删除内容并比较极值?使用 len()、del、max() 和 min()。
  4. 如何生成规律序列并在遍历时获取序号?使用 range() 和 enumerate()。

练习 ​

  1. 使用 + 合并两个学生名单,再用 len() 统计总人数
  2. 使用 in 判断一个姓名是否在列表中
  3. 使用 max() 和 min() 找出一组成绩中的最高分和最低分
  4. 使用 enumerate() 遍历学生名单,并从 1 开始输出序号