列表就像你的"购物清单" - 可以增加、删除、排序,还能快速找到需要的东西
🎯 本章目标
学完本章,你会:
✅ 理解列表是什么以及为什么需要它
✅ 掌握列表的创建和基本操作
✅ 熟练使用列表的各种方法
✅ 理解列表推导式的用法
✅ 能在测试工作中灵活使用列表
🎪 开篇:为什么需要列表?
想象一下这个场景:你需要记录10个测试用例的执行结果
没有列表的世界:
result1 = "passed"result2 = "passed"result3 = "failed"result4 = "passed"result5 = "failed"result6 = "passed"result7 = "passed"result8 = "passed"result9 = "passed"result10 = "failed"# 想统计通过率?你得一个一个数...
有列表的世界:
test_results = ["passed", "passed", "failed", "passed", "failed", "passed", "passed", "passed", "passed", "failed"]# 统计通过率?一行代码搞定!pass_count = test_results.count("passed")pass_rate = pass_count / len(test_results) * 100
列表让管理多个数据变得简单!
📦 什么是列表?
直观理解列表就像一个可以装很多东西的箱子:
箱子 = 列表
箱子里的东西 = 列表的元素
箱子有编号 = 列表的索引(从0开始)
可以往箱子里加东西、拿东西、换东西
技术定义
列表是Python中的一种有序、可变的数据结构,可以存储任意类型的数据。
四个关键特性:
有序:元素有固定顺序,先放进去的在前面
可变:可以修改、添加、删除元素
可重复:可以包含重复的元素
类型灵活:可以包含不同类型的元素
➕ 创建列表:三种方法
方法1:方括号直接创建(最常用)
# 空列表empty_list = []# 包含元素的列表fruits = ["苹果", "香蕉", "橙子"]numbers = [1, 2, 3, 4, 5]# 混合类型的列表mixed = ["文本", 123, 3.14, True, None]# 测试相关的列表test_cases = ["登录测试", "注册测试", "支付测试"]status_codes = [200, 301, 400, 401, 403, 404, 500]
方法2:使用list()函数转换
# 从字符串创建list("hello") # ['h', 'e', 'l', 'l', 'o']# 从range创建list(range(5)) # [0, 1, 2, 3, 4]# 从元组创建tuple_data = (1, 2, 3)list_from_tuple = list(tuple_data) # [1, 2, 3]# 实战:生成测试用例编号test_ids = list(range(1, 11)) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]test_cases = [f"TC{id:03d}" for id in test_ids] # ['TC001', 'TC002', ...]
方法3:列表推导式(高级创建)
# 生成1-10的平方squares = [x**2 for x in range(1, 11)]# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 生成测试数据test_users = [f"user{i}" for i in range(1, 6)]# ['user1', 'user2', 'user3', 'user4', 'user5']
🔍 访问列表元素
通过索引访问; 列表的索引从0开始,就像楼层编号(一楼是1,但索引0是第一个元素)
fruits = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]# 正索引(从左到右)print(fruits[0]) # 苹果(第一个)print(fruits[1]) # 香蕉(第二个)print(fruits[2]) # 橙子(第三个)# 负索引(从右到左)print(fruits[-1]) # 芒果(最后一个)print(fruits[-2]) # 葡萄(倒数第二个)print(fruits[-3]) # 橙子(倒数第三个)# 测试示例test_steps = ["打开浏览器", "输入网址", "输入用户名", "输入密码", "点击登录"]print(f"第一步:{test_steps[0]}") # 打开浏览器print(f"最后一步:{test_steps[-1]}") # 点击登录
切片操作:获取子列表
# 基本语法:list[start:end:step]# start: 开始索引(包含)# end: 结束索引(不包含)# step: 步长(默认为1)numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 获取前3个first_three = numbers[:3] # [0, 1, 2]# 获取第3到第6个middle = numbers[2:6] # [2, 3, 4, 5]# 获取最后3个last_three = numbers[-3:] # [7, 8, 9]# 获取所有偶数evens = numbers[::2] # [0, 2, 4, 6, 8]# 反转列表reversed_list = numbers[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]# 实战:分批执行测试all_tests = ["T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9", "T10"]# 第一批:前5个batch1 = all_tests[:5] # ['T1', 'T2', 'T3', 'T4', 'T5']# 第二批:后5个batch2 = all_tests[5:] # ['T6', 'T7', 'T8', 'T9', 'T10']# 每隔一个执行一个alternate = all_tests[::2] # ['T1', 'T3', 'T5', 'T7', 'T9']
获取列表长度
fruits = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]length = len(fruits) # 5test_cases = ["登录", "注册", "支付", "搜索", "购物车", "订单"]test_count = len(test_cases) # 6print(f"共有{test_count}个测试用例")
✏️ 修改列表元素
修改单个元素
# 直接通过索引修改fruits = ["苹果", "香蕉", "橙子"]fruits[1] = "芒果" # 把"香蕉"改成"芒果"# 结果:["苹果", "芒果", "橙子"]# 实战:更新测试状态test_status = ["待执行", "执行中", "待执行", "已完成"]test_status[1] = "已通过" # 第二个测试通过test_status[2] = "执行中" # 第三个测试开始执行
批量修改(切片赋值)
# 修改一个范围内的元素numbers = [0, 1, 2, 3, 4, 5]numbers[1:4] = [10, 20, 30] # 修改索引1-3的元素# 结果:[0, 10, 20, 30, 4, 5]# 可以替换成不同数量的元素numbers = [1, 2, 3, 4, 5]numbers[1:3] = [20, 30, 40] # 用3个元素替换2个元素# 结果:[1, 20, 30, 40, 4, 5]# 实战:批量更新测试结果test_results = ["待执行", "待执行", "待执行", "待执行", "待执行"]test_results[:3] = ["通过", "失败", "通过"] # 更新前3个测试的结果
➕ 添加元素到列表
append():在末尾添加一个元素
fruits = ["苹果", "香蕉", "橙子"]fruits.append("葡萄") # 在末尾添加"葡萄"# 结果:["苹果", "香蕉", "橙子", "葡萄"]# 可以添加任何类型fruits.append(123) # ["苹果", "香蕉", "橙子", "葡萄", 123]# 实战:记录测试用例test_cases = ["登录测试", "注册测试"]test_cases.append("支付测试") # 添加新测试用例test_cases.append("搜索测试") # 再添加一个
insert():在指定位置插入元素
fruits = ["苹果", "香蕉", "橙子"]fruits.insert(1, "芒果") # 在索引1的位置插入"芒果"# 结果:["苹果", "芒果", "香蕉", "橙子"]# 实战:插入高优先级测试test_queue = ["TC002", "TC003", "TC004"]test_queue.insert(0, "TC001") # 在最前面插入test_queue.insert(2, "TC001-紧急") # 在第三个位置插入紧急测试
extend():添加多个元素
fruits = ["苹果", "香蕉"]more_fruits = ["橙子", "葡萄", "芒果"]fruits.extend(more_fruits) # 添加多个元素# 结果:["苹果", "香蕉", "橙子", "葡萄", "芒果"]# 等价于fruits = ["苹果", "香蕉"]fruits += ["橙子", "葡萄", "芒果"] # 使用+=# 实战:批量导入测试用例existing_tests = ["登录测试", "注册测试"]new_tests = ["支付测试", "搜索测试", "购物车测试"]existing_tests.extend(new_tests) # 批量添加
❌ 从列表删除元素
remove():删除指定值的元素
fruits = ["苹果", "香蕉", "橙子", "香蕉", "葡萄"]fruits.remove("香蕉") # 删除第一个"香蕉"# 结果:["苹果", "橙子", "香蕉", "葡萄"]# 如果要删除的值不存在,会报错# fruits.remove("西瓜") # ValueError: list.remove(x): x not in list# 实战:删除已完成的测试pending_tests = ["登录测试", "注册测试", "支付测试", "搜索测试"]pending_tests.remove("登录测试") # 登录测试已完成
pop():删除指定位置的元素
fruits = ["苹果", "香蕉", "橙子", "葡萄"]# 删除最后一个元素last_fruit = fruits.pop() # 返回"葡萄",fruits变成["苹果", "香蕉", "橙子"]# 删除指定位置的元素second_fruit = fruits.pop(1) # 返回"香蕉",fruits变成["苹果", "橙子"]# 实战:处理测试队列test_queue = ["TC001", "TC002", "TC003", "TC004"]current_test = test_queue.pop(0) # 取出并执行第一个测试print(f"正在执行: {current_test}") # TC001
del语句:删除元素或切片
fruits = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]# 删除单个元素del fruits[1] # 删除索引1的元素("香蕉")# 结果:["苹果", "橙子", "葡萄", "芒果"]# 删除切片del fruits[1:3] # 删除索引1-2的元素# 结果:["苹果", "芒果"]# 删除整个列表del fruits # 列表被删除,不能再访问# 实战:清理测试数据test_results = ["pass", "fail", "pass", "error", "pass"]del test_results[3] # 删除错误结果del test_results[-2:] # 删除最后两个结果
clear():清空列表
fruits = ["苹果", "香蕉", "橙子"]fruits.clear() # 清空所有元素# 结果:[]# 实战:重置测试环境test_queue = ["TC001", "TC002", "TC003", "TC004"]print(f"当前队列: {test_queue}")test_queue.clear() # 清空队列print(f"清空后: {test_queue}") # []
🔍 查找列表元素
index():查找元素的位置
fruits = ["苹果", "香蕉", "橙子", "葡萄", "香蕉"]# 查找第一个"香蕉"的位置pos = fruits.index("香蕉") # 1# 从指定位置开始查找pos2 = fruits.index("香蕉", 2) # 从索引2开始找,结果是4# 如果元素不存在,会报错# pos = fruits.index("西瓜") # ValueError: '西瓜' is not in list# 实战:查找测试用例test_cases = ["登录测试", "注册测试", "支付测试", "搜索测试", "支付测试"]try: pos = test_cases.index("支付测试") print(f"支付测试在位置: {pos}")except ValueError: print("支付测试不存在")
count():统计元素出现的次数
fruits = ["苹果", "香蕉", "橙子", "香蕉", "葡萄", "香蕉"]# 统计"香蕉"出现的次数banana_count = fruits.count("香蕉") # 3apple_count = fruits.count("苹果") # 1mango_count = fruits.count("芒果") # 0# 实战:统计测试结果test_results = ["passed", "failed", "passed", "passed", "failed", "passed"]passed_count = test_results.count("passed") # 4failed_count = test_results.count("failed") # 2total = len(test_results) # 6pass_rate = passed_count / total * 100print(f"通过率: {pass_rate:.1f}%") # 66.7%
in运算符:检查元素是否存在
fruits = ["苹果", "香蕉", "橙子"]# 检查元素是否存在has_apple = "苹果" in fruits # Truehas_mango = "芒果" in fruits # Falsenot_has_mango = "芒果" not in fruits # True# 实战:检查测试用例是否存在test_cases = ["登录测试", "注册测试", "支付测试"]if "安全测试" in test_cases: print("安全测试已包含")else: print("需要添加安全测试")if "登录测试" not in test_cases: test_cases.append("登录测试")
🔄 列表排序
sort():原地排序(修改原列表)
numbers = [3, 1, 4, 1, 5, 9, 2]# 升序排序numbers.sort() # [1, 1, 2, 3, 4, 5, 9]# 降序排序numbers.sort(reverse=True) # [9, 5, 4, 3, 2, 1, 1]# 字符串排序fruits = ["banana", "Apple", "cherry", "date"]fruits.sort() # ['Apple', 'banana', 'cherry', 'date'](大写字母在前)fruits.sort(key=str.lower) # 忽略大小写:['Apple', 'banana', 'cherry', 'date']# 实战:按执行时间排序测试用例test_data = [ ("登录测试", 5.2), ("注册测试", 3.8), ("支付测试", 8.1), ("搜索测试", 1.5)]# 按执行时间升序排序test_data.sort(key=lambda x: x[1]) # 按第二个元素(时间)排序# 结果:[('搜索测试', 1.5), ('注册测试', 3.8), ('登录测试', 5.2), ('支付测试', 8.1)]# 按测试名称排序test_data.sort(key=lambda x: x[0]) # 按第一个元素(名称)排序
sorted():返回新列表(不修改原列表)
numbers = [3, 1, 4, 1, 5, 9, 2]# 返回排序后的新列表sorted_numbers = sorted(numbers) # [1, 1, 2, 3, 4, 5, 9]# numbers不变:[3, 1, 4, 1, 5, 9, 2]# 降序排序desc_numbers = sorted(numbers, reverse=True) # [9, 5, 4, 3, 2, 1, 1]# 实战:排序测试用例但不修改原列表test_cases = ["支付测试", "登录测试", "注册测试", "搜索测试"]sorted_cases = sorted(test_cases) # ['登录测试', '搜索测试', '支付测试', '注册测试']# test_cases不变:['支付测试', '登录测试', '注册测试', '搜索测试']
reverse():反转列表顺序
numbers = [1, 2, 3, 4, 5]numbers.reverse() # [5, 4, 3, 2, 1]# 注意:reverse()是原地反转# 如果要创建新列表,可以用切片numbers = [1, 2, 3, 4, 5]reversed_numbers = numbers[::-1] # [5, 4, 3, 2, 1]# numbers不变:[1, 2, 3, 4, 5]# 实战:反转测试执行顺序test_queue = ["TC001", "TC002", "TC003", "TC004"]test_queue.reverse() # ['TC004', 'TC003', 'TC002', 'TC001']
🧮 列表推导式:简洁的创建方式
基本语法
# 传统方式squares = []for i in range(5): squares.append(i**2) #[0, 1, 4, 9, 16]# 列表推导式 squares = [i**2 for i in range(5)] #[0, 1, 4, 9, 16]
带条件的列表推导式
# 生成1-10的偶数evens = [x for x in range(1, 11) if x % 2 == 0] # [2, 4, 6, 8, 10]# 生成1-10的奇数平方odd_squares = [x**2 for x in range(1, 11) if x % 2 == 1] # [1, 9, 25, 49, 81]# 实战:生成测试数据# 生成10个测试用户test_users = [f"user{i:03d}" for i in range(1, 11)]# ['user001', 'user002', ..., 'user010']# 生成测试邮箱test_emails = [f"test{i:03d}@example.com" for i in range(100)]# ['test001@example.com', 'test002@example.com', ...]
多个for循环
# 生成坐标对coordinates = [(x, y) for x in range(3) for y in range(3)]# [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]# 实战:生成测试组合browsers = ["Chrome", "Firefox", "Safari"]resolutions = ["1920x1080", "1366x768", "375x812"]test_combinations = [(browser, res) for browser in browsers for res in resolutions]# [('Chrome', '1920x1080'), ('Chrome', '1366x768'), ...]
实战应用
# 筛选失败的测试all_results = ["passed", "failed", "passed", "error", "failed", "passed"]failed_results = [result for result in all_results if result in ["failed", "error"]]# ['failed', 'error', 'failed']# 转换测试结果格式results = ["PASS", "FAIL", "PASS", "ERROR"]formatted = ["✅ 通过" if r == "PASS" else "❌ 失败" if r == "FAIL" else "⚠️ 错误" for r in results]# ['✅ 通过', '❌ 失败', '✅ 通过', '⚠️ 错误']# 提取测试执行时间test_data = [ ("登录测试", 5.2, "passed"), ("注册测试", 3.8, "failed"), ("支付测试", 8.1, "passed")]durations = [time for _, time, _ in test_data] # [5.2, 3.8, 8.1]
📊 列表常用函数
len():获取长度
fruits = ["苹果", "香蕉", "橙子"]length = len(fruits) # 3test_cases = ["登录测试", "注册测试", "支付测试", "搜索测试", "购物车测试"]total_cases = len(test_cases) # 5print(f"共有{total_cases}个测试用例")
max()/min():最大值/最小值
numbers = [3, 1, 4, 1, 5, 9, 2]max_num = max(numbers) # 9min_num = min(numbers) # 1# 字符串比较(按ASCII码)words = ["apple", "banana", "cherry"]max_word = max(words) # "cherry"min_word = min(words) # "apple"# 实战:找最长执行时间的测试test_times = [5.2, 3.8, 8.1, 1.5, 6.7]longest = max(test_times) # 8.1shortest = min(test_times) # 1.5print(f"最长执行时间: {longest}秒")
sum():求和
numbers = [1, 2, 3, 4, 5]total = sum(numbers) # 15# 实战:计算总测试时间test_times = [5.2, 3.8, 8.1, 1.5, 6.7]total_time = sum(test_times) # 25.3avg_time = total_time / len(test_times) # 5.06print(f"总测试时间: {total_time}秒,平均: {avg_time:.1f}秒")
any()/all():条件检查
# any():至少一个为Truetest_results = [True, False, False, True]has_pass = any(test_results) # True# all():所有都为Trueall_pass = all(test_results) # False# 实战:检查测试结果results = ["passed", "passed", "failed", "passed"]all_passed = all(r == "passed" for r in results) # Falseany_failed = any(r != "passed" for r in results) # True
🔁 遍历列表
基本遍历
fruits = ["苹果", "香蕉", "橙子", "葡萄"]# 遍历元素for fruit in fruits: print(f"我喜欢吃{fruit}")# 遍历索引和元素for i, fruit in enumerate(fruits): print(f"第{i}个水果是{fruit}")# 第0个水果是苹果# 第1个水果是香蕉# ...# 从1开始编号for i, fruit in enumerate(fruits, 1): print(f"水果{i}: {fruit}")
实战:遍历测试用例
# 遍历测试用例test_cases = ["登录测试", "注册测试", "支付测试", "搜索测试"]print("开始执行测试套件...")for i, test_case in enumerate(test_cases, 1): print(f"\n[{i}/{len(test_cases)}] 执行测试: {test_case}") # 这里可以调用实际的测试函数 # result = execute_test(test_case) # print(f"结果: {result}")print("✅ 所有测试执行完成")
同时遍历多个列表
# zip()函数:同时遍历多个列表test_names = ["登录测试", "注册测试", "支付测试"]test_times = [5.2, 3.8, 8.1]test_results = ["passed", "passed", "failed"]print("测试报告:")for name, time, result in zip(test_names, test_times, test_results): status = "✅" if result == "passed" else "❌" print(f"{status}{name} - 用时: {time}秒")
🧩 总结:列表的常用操作
操作 | 方法/语法 | 示例 | 结果 |
|---|
创建 | []或 list()
| [1, 2, 3]
| [1, 2, 3]
|
访问 | list[index]
| list[0]
| 第一个元素 |
切片 | list[start:end]
| list[1:3]
| 索引1-2的元素 |
长度 | len(list)
| len([1,2,3])
| 3 |
添加 | append(), insert(), extend()
| list.append(4)
| 末尾添加4 |
删除 | remove(), pop(), del, clear()
| list.remove(2)
| 删除值为2的元素 |
查找 | index(), count(), in
| list.index(3)
| 3的位置 |
排序 | sort(), sorted()
| list.sort()
| 升序排序 |
反转 | reverse()
| list.reverse()
| 反转顺序 |
最大值 | max(list)
| max([1,5,3])
| 5 |
最小值 | min(list)
| min([1,5,3])
| 1 |
求和 | sum(list)
| sum([1,2,3])
| 6 |
遍历 | for item in list:
| 遍历每个元素 | - |
🎉 恭喜!列表掌握完成;现在你已经学会了Python中最重要、最常用的数据结构之一!
关键收获:
✅ 创建列表:三种方法创建列表
✅ 访问元素:索引、切片、获取长度
✅ 修改列表:增、删、改各种操作
✅ 查找排序:查找元素、排序列表
✅ 列表推导式:简洁创建列表
✅ 实战应用:在测试中灵活使用列表
列表是自动化测试的基础,你会经常用它来:
下一章预告:字典 - 键值对的数据结构
你会学习如何用字典存储结构化数据,比如测试用例详情、用户信息、接口参数等。
准备好了吗?让我们继续前进!🚀
记住:列表要多用才能掌握。尝试用列表改写你之前的代码,看看能不能变得更简洁、更高效。