容器的公共操作
学生名单可能暂时保存在列表中,成绩可能保存在元组中,配置信息也可能使用字典保存。面对这些不同的容器,如何合并数据、判断成员、统计数量,并在遍历时显示序号?
这些需求不应该为每种容器分别记一套写法。字符串、列表、元组、字典和集合虽然结构不同,但有一组可以复用的公共操作。本节围绕这组问题整理运算符和工具,并在最后完成一次学生名单处理。
公共运算符
先看跨容器可复用的四个运算符,再根据数据类型确认它们的适用范围。
| 运算符 | 作用 | 常见支持类型 |
|---|---|---|
+ | 拼接两个容器 | 字符串、列表、元组 |
* | 重复容器中的内容 | 字符串、列表、元组 |
in | 判断元素是否存在 | 字符串、列表、元组、字典、集合 |
not in | 判断元素是否不存在 | 字符串、列表、元组、字典、集合 |
拼接与重复
两个小组名单需要合并,或一条分隔线需要重复输出时,可以先判断目标是拼接还是重复。
拼接: + 可以拼接两个相同类型的字符串、列表或元组:
# 拼接字符串
text1 = "Python"
text2 = "基础课"
print(text1 + text2)
# 拼接列表
group1 = ["张三", "李四"]
group2 = ["王五", "赵六"]
print(group1 + group2)
# 拼接元组
scores1 = (88, 92)
scores2 = (85,)
print(scores1 + scores2)运行结果:
Python基础课
['张三', '李四', '王五', '赵六']
(88, 92, 85)注意,+ 两边的容器类型必须一致。列表不能直接和元组拼接。
重复: * 可以把字符串、列表或元组中的内容重复指定次数:
print("-" * 10)
print(["Python"] * 3)
print((100,) * 3)运行结果:
----------
['Python', 'Python', 'Python']
(100, 100, 100)这里的“重复”会生成一个新容器,不会修改原容器。
注意嵌套的可变对象
如果列表中保存的是列表或字典,使用 * 重复后,内部对象可能仍然被共享。这和上一节的对象引用问题相同。
成员判断
名单查询首先要回答“某个值是否存在”。in 判断元素是否存在,not in 判断元素是否不存在:
names = ["张三", "李四", "王五"]
print("张三" in names)
print("赵六" not in names)
print("Py" in "Python")
print(90 in (88, 90, 95))
print(60 in {60, 70, 80})运行结果:
True
True
True
True
True如果操作的是字典,in 和 not in 判断的是键,不是值:
student = {"name": "张三", "age": 18}
print("name" in student)
print("张三" in student)
print("张三" in student.values())运行结果:
True
False
True公共工具
完成名单统计和遍历,还需要处理长度、删除、极值、序列和序号等问题。下面按使用场景合并介绍这些工具。
| 写法 | 作用 |
|---|---|
len() | 统计元素个数 |
del | 删除变量或容器中的元素 |
max() | 返回最大值 |
min() | 返回最小值 |
range(start, stop, step) | 按规律生成整数序列 |
enumerate(iterable, start=0) | 遍历时同时获得序号和元素 |
其中,del 是关键字,不是函数。其他几个都是 Python 提供的内置函数。
长度、删除与比较
统计人数、删除指定数据和比较成绩时,分别使用以下工具。
长度统计: len() 返回容器中的元素个数:
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}))运行结果:
6
4
4
3
2字典的长度是键值对的数量,集合的长度是不重复元素的数量。
删除内容: del 可以删除变量,也可以删除容器中的指定元素。
删除列表中的第一个元素:
names = ["张三", "李四", "王五"]
del names[0]
print(names)运行结果:
['李四', '王五']删除变量后,这个变量名就不能继续使用:
name = "张三"
del name
print(name)运行到 print(name) 时会出现 NameError,因为变量 name 已经不存在。
极值比较: max() 返回最大值,min() 返回最小值:
scores = [88, 92, 85, 96]
print(max(scores))
print(min(scores))
print(max("abcdefg"))
print(min("abcdefg"))运行结果:
96
85
g
a字符串会按照字符的编码顺序比较。初学阶段,max() 和 min() 主要用来处理数字容器。
序列生成与序号遍历
需要按规律生成编号,或在遍历名单时同时拿到位置和内容时,使用这一组工具。
序列生成: range() 常和 for 循环一起使用。它有三种常见写法:
# 只设置结束位置:从 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=" ")运行结果:
0 1 2 3 4
1 2 3 4
1 3 5可以这样记:
range(start, stop, step)start:开始位置,默认是0stop:结束位置,不包含这个数step:每次增加的步长,默认是1
序号遍历: 直接遍历列表时,只能拿到元素:
names = ["张三", "李四", "王五"]
for name in names:
print(name)如果同时需要序号和元素,可以使用 enumerate():
names = ["张三", "李四", "王五"]
for item in enumerate(names):
print(item)
for index, name in enumerate(names, start=1):
print(f"序号:{index},姓名:{name}")运行结果:
(0, '张三')
(1, '李四')
(2, '王五')
序号:1,姓名:张三
序号:2,姓名:李四
序号:3,姓名:王五enumerate() 每次产生一个“序号和元素”组成的元组。start=1 表示序号从 1 开始;如果不设置,默认从 0 开始。
案例:输出学生名单
前面的运算符和工具分别解决了合并、统计、判断和编号问题。现在将它们组合起来,完成一个学生名单处理案例。
案例需求如下:
- 合并两个小组的学生名单
- 输出学生总人数
- 判断“王五”是否在名单中
- 从
1开始显示每名学生的序号
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}")运行结果:
学生总人数:4
王五是否在名单中:True
1. 张三
2. 李四
3. 王五
4. 赵六小结
本节围绕四个问题组织了公共操作:
- 如何拼接或重复字符串、列表、元组?使用
+和*。 - 如何判断成员是否存在?使用
in和not in。 - 如何统计长度、删除内容并比较极值?使用
len()、del、max()和min()。 - 如何生成规律序列并在遍历时获取序号?使用
range()和enumerate()。
练习
- 使用
+合并两个学生名单,再用len()统计总人数 - 使用
in判断一个姓名是否在列表中 - 使用
max()和min()找出一组成绩中的最高分和最低分 - 使用
enumerate()遍历学生名单,并从1开始输出序号