1. 列表
列表用于按顺序保存多个值。课程主题、待处理任务、模型消息和接口返回的记录,都可以先放进列表中,再逐个读取或处理。
使用方括号创建列表,元素之间用逗号分隔:
1topics = ["变量", "条件语句", "for 循环"]2numbers = [1, 2, 3, 4]3empty = []45print(topics)6print(numbers)7print(empty)
列表可以保存不同类型的值,但实际项目中通常让同一个列表中的元素具有相近的含义:
1profile = ["小明", 18, True]23print(profile)
也可以使用 list() 把其他可遍历对象转换成列表:
1letters = list("Python")2numbers = list(range(3))34print(letters) # ['P', 'y', 't', 'h', 'o', 'n']5print(numbers) # [0, 1, 2]
列表是可变对象。创建空列表后,可以通过方法逐步添加数据:
1tasks = []23tasks.append("读取文件")4tasks.append("处理数据")56print(tasks)
2. 访问
列表中的元素按照位置保存,索引从 0 开始:
1topics = ["变量", "列表", "字符串"]23print(topics[0]) # 变量4print(topics[1]) # 列表5print(topics[-1]) # 字符串
如果索引超出范围,会抛出 IndexError。读取不确定长度的列表时,可以先使用 len() 判断:
1topics = ["变量", "列表"]23if len(topics) > 2:4print(topics[2])5else:6print("没有第三个主题")
切片可以得到一部分元素,规则和字符串切片一样:开始位置包含,结束位置不包含:
1topics = ["变量", "列表", "字符串", "条件语句"]23print(topics[0:2]) # ['变量', '列表']4print(topics[2:]) # ['字符串', '条件语句']5print(topics[:3]) # ['变量', '列表', '字符串']6print(topics[::-1]) # 倒序列表
in 和 not in 用来判断元素是否存在:
1topics = ["变量", "列表", "字符串"]23if "列表" in topics:4print("已经学习列表")56if "字典" not in topics:7print("还没有学习字典")
3. 修改
列表可以通过索引修改某个元素:
1topics = ["变量", "数组", "字符串"]2topics[1] = "列表"34print(topics)
append() 在列表末尾添加一个元素,extend() 则把另一个可遍历对象中的元素逐个添加进去:
1topics = ["变量"]23topics.append(["列表", "字符串"])4print(topics) # ['变量', ['列表', '字符串']]56topics = ["变量"]7topics.extend(["列表", "字符串"])8print(topics) # ['变量', '列表', '字符串']
append() 会把参数作为一个整体放进去,extend() 会展开参数中的元素。两者的结果不同,选择时要先明确自己想要哪一种结构。
列表还可以使用 + 拼接。它会按照顺序连接两个列表,并返回一个新的列表,不会修改原来的列表:
1basic_topics = ["变量", "列表"]2advanced_topics = ["模块", "函数"]34all_topics = basic_topics + advanced_topics56print(all_topics) # ['变量', '列表', '模块', '函数']7print(basic_topics) # ['变量', '列表']
+ 两边都必须是列表,不能直接把列表和一个单独的元素相加。需要把多个元素追加到原列表时,可以使用 +=:
1topics = ["变量"]2topics += ["列表", "字符串"]34print(topics) # ['变量', '列表', '字符串']
可以简单地这样区分:+ 生成新的列表,+= 把右侧列表中的元素加入当前列表。
insert(index, value) 可以在指定位置插入元素:
1topics = ["变量", "字符串"]2topics.insert(1, "列表")34print(topics)
删除元素时,remove() 按值删除第一次出现的元素,pop() 按索引删除并返回元素:
1topics = ["变量", "列表", "字符串", "列表"]23topics.remove("列表")4last_topic = topics.pop()56print(topics) # ['变量', '字符串']7print(last_topic) # 列表
如果列表中不存在要删除的值,remove() 会抛出 ValueError;如果索引不存在,pop() 会抛出 IndexError。不确定数据是否存在时,先用 in 检查,或者捕获异常。
clear() 会删除列表中的所有元素,但保留列表对象本身:
1tasks = ["读取文件", "保存结果"]2tasks.clear()34print(tasks) # []
4. 查找
列表提供了几个常用的统计和查找方法:
| 方法 | 作用 | 说明 |
|---|---|---|
len(list) | 获取长度 | 返回元素数量 |
count(value) | 统计数量 | 统计值出现的次数 |
index(value) | 查找位置 | 返回第一次出现的索引 |
min(list) | 最小值 | 元素需要支持比较 |
max(list) | 最大值 | 元素需要支持比较 |
sum(list) | 求和 | 通常用于数字列表 |
1scores = [82, 95, 76, 82]23print(len(scores)) # 44print(scores.count(82)) # 25print(scores.index(95)) # 16print(min(scores)) # 767print(max(scores)) # 958print(sum(scores)) # 335
调用 index() 前最好先确认元素存在,否则找不到值时会抛出 ValueError:
1topics = ["变量", "列表", "字符串"]2target = "字典"34if target in topics:5print(topics.index(target))6else:7print("没有找到这个主题")
列表可以使用 sort() 原地排序,也可以使用 sorted() 生成一个新的排序结果:
1scores = [82, 95, 76, 88]23scores.sort()4print(scores) # [76, 82, 88, 95]56descending = sorted(scores, reverse=True)7print(descending) # [95, 88, 82, 76]
sort() 会直接改变原列表,sorted() 不会改变原列表。只想查看排序结果、还需要保留原始顺序时,优先使用 sorted()。
字符串列表也可以按照字符串长度排序:
1topics = ["列表", "Python", "字符串"]23ordered = sorted(topics, key=len)4print(ordered)
5. 遍历
for 循环是处理列表中每个元素最常见的方式:
1topics = ["变量", "列表", "字符串"]23for topic in topics:4print(f"正在学习:{topic}")
如果需要同时使用下标,可以使用 enumerate():
1topics = ["变量", "列表", "字符串"]23for index, topic in enumerate(topics, start=1):4print(f"第 {index} 个主题:{topic}")
遍历时也可以配合条件语句完成筛选或统计:
1scores = [58, 76, 91, 42, 68]2passed = []34for score in scores:5if score >= 60:6passed.append(score)78print(passed) # [76, 91, 68]
如果只是根据一个简单条件生成新列表,可以使用列表推导式:
1scores = [58, 76, 91, 42, 68]2passed = [score for score in scores if score >= 60]34print(passed)
列表推导式只是 for 循环的一种简写。刚开始学习时,可以先读懂普通循环,再使用推导式;如果条件和转换逻辑太复杂,普通循环通常更容易维护。
6. 组合
列表经常与字典、循环和条件语句组合使用,保存一组结构相同的数据:
01users = [02{"name": "小明", "active": True},03{"name": "小红", "active": False},04{"name": "小李", "active": True},05]0607active_names = []08for user in users:09if user["active"]:10active_names.append(user["name"])1112print(active_names) # ['小明', '小李']
列表也可以嵌套列表,用来表达二维数据:
1table = [2["姓名", "分数"],3["小明", 82],4["小红", 95],5]67print(table[1][0]) # 小明8print(table[2][1]) # 95
复制列表时要注意:直接赋值不会创建新列表,只是让两个变量指向同一个列表:
1original = ["变量", "列表"]2alias = original3alias.append("字符串")45print(original) # ['变量', '列表', '字符串']
如果需要一个独立的列表,可以使用切片、copy() 或 list():
1original = ["变量", "列表"]2copied = original.copy()3copied.append("字符串")45print(original) # ['变量', '列表']6print(copied) # ['变量', '列表', '字符串']
这些方式是浅复制。如果列表中还嵌套了其他列表,内部列表仍然可能被共享。初学阶段先记住:简单的一维列表可以用 copy(),复杂嵌套结构需要进一步了解深复制。
下面的例子把带空格的课程名称清理后排序,展示列表在实际数据处理中的组合用法:
01raw_topics = [" Python ", "列表", "", "字符串 "]02topics = []0304for raw_topic in raw_topics:05topic = raw_topic.strip()06if topic:07topics.append(topic)0809topics.sort()10print(topics) # ['Python', '列表', '字符串']