当前位置:首页>python>Python列表:有序的数据容器

Python列表:有序的数据容器

  • 2026-09-02 20:16:32
Python列表:有序的数据容器

列表就像你的"购物清单" - 可以增加、删除、排序,还能快速找到需要的东西

🎯 本章目标

学完本章,你会:

  1. ✅ 理解列表是什么以及为什么需要它

  2. ✅ 掌握列表的创建和基本操作

  3. ✅ 熟练使用列表的各种方法

  4. ✅ 理解列表推导式的用法

  5. ✅ 能在测试工作中灵活使用列表


🎪 开篇:为什么需要列表?

想象一下这个场景:你需要记录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. 有序:元素有固定顺序,先放进去的在前面

  2. 可变:可以修改、添加、删除元素

  3. 可重复:可以包含重复的元素

  4. 类型灵活:可以包含不同类型的元素


➕ 创建列表:三种方法

方法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中最重要、最常用的数据结构之一!

关键收获:

  1. ✅ 创建列表:三种方法创建列表

  2. ✅ 访问元素:索引、切片、获取长度

  3. ✅ 修改列表:增、删、改各种操作

  4. ✅ 查找排序:查找元素、排序列表

  5. ✅ 列表推导式:简洁创建列表

  6. ✅ 实战应用:在测试中灵活使用列表

列表是自动化测试的基础,你会经常用它来:

  • 管理测试用例

  • 存储测试数据

  • 记录测试结果

  • 批量执行测试

下一章预告:字典 - 键值对的数据结构

你会学习如何用字典存储结构化数据,比如测试用例详情、用户信息、接口参数等。

准备好了吗?让我们继续前进!🚀

记住:列表要多用才能掌握。尝试用列表改写你之前的代码,看看能不能变得更简洁、更高效。

最新文章

随机文章