黔南布依族苗族自治州网站建设_网站建设公司_营销型网站_seo优化
2025/12/22 23:31:20 网站建设 项目流程

Python中的数据结构(容器)之列表(list)

容器用于存储多个数据,是基础语法的核心组成,常用的有 4 种:

  1. 列表(list)—— 有序、可变、可重复
  2. 字典(dict)—— 键值对、无序、键唯一
  3. 元组(tuple)—— 有序、不可变、可重复
  4. 集合(set)—— 无序、无重复、可交并差

列表(list)

列表是 Python 中最常用的数据结构之一,它是一种有序、可变(可修改)的集合,可以存储任意类型的元素。

列表的本质是一个可以动态扩容动态数组,在内存中是连续的,所以列表是一个支持随机访问并且可以改变大小的数据结构,其性质和C++中的vector有异曲同工之妙

列表在内存中,会以以下方式进行存储,

核心特点
  • 有序:每个元素有唯一索引(从 0 开始),可通过索引精准访问;
  • 可变:可随时增、删、改元素(区别于元组 tuple);
  • 可重复:允许存储重复元素;
  • 多类型:可同时存储整数、字符串、列表等不同类型数据。

列表用方括号[]包裹,元素之间用逗号,分隔,可存储不同类型的数据,也可创建空列表。

# 1. 空列表empty_list=[]print(empty_list)# 输出:[]# 2. 普通列表(同类型元素)num_list=[1,2,3,4,5]# 整数列表str_list=["Python","Java","C++"]# 字符串列表# 3. 混合类型列表(不同类型元素)mix_list=[1,"hello",3.14,True]print(mix_list)# 4. 嵌套列表(列表里包含列表,二维列表)nested_list=[[1,2],[3,4],[5,6]]# 类似矩阵print(nested_list)

嵌套列表其逻辑结构如下:

列表的基础操作 - 增删改查
1、查

通过索引切片访问,索引是元素的 “位置编号”,从 0 开始,支持负数索引(-1 表示最后一个元素)

索引时注意列表长度,如果访问了不存在的元素,会导致 IndexError

索引访问:

fruits=["苹果","香蕉","橙子","葡萄"]# 正向索引(从0开始)print(fruits[0])# 输出:苹果(第一个元素)print(fruits[2])# 输出:橙子(第三个元素)# 反向索引(从-1开始)print(fruits[-1])# 输出:葡萄(最后一个元素)print(fruits[-3])# 输出:香蕉(倒数第三个元素)# 嵌套列表访问(先查外层,再查内层)matrix=[[1,2],[3,4]]print(matrix[1][0])# 输出:3(外层第2个列表的第1个元素)

切片访问:

语法:列表[start:end:step]

  • start:起始索引(默认 0,包含);
  • end:结束索引(默认列表长度,不包含);
  • step:步长(默认 1,负数表示反向切片)
nums=[0,1,2,3,4,5,6,7,8,9]# 基础切片:取索引1到4(不包含4)print(nums[1:4])# 输出:[1,2,3]# 省略start:从开头到索引5(不包含5)print(nums[:5])# 输出:[0,1,2,3,4]# 省略end:从索引5到末尾print(nums[5:])# 输出:[5,6,7,8,9]# 步长为2:每隔1个取一个print(nums[0:10:2])# 输出:[0,2,4,6,8]# 反向切片:反转列表print(nums[::-1])# 输出:[9,8,7,6,5,4,3,2,1,0]
2、改

通过索引直接赋值,列表是可变对象,修改会直接改变原列表。

fruits=["苹果","香蕉","橙子","葡萄"]fruits[1]="芒果"# 将索引1的元素改为“芒果”print(fruits)# 嵌套列表修改matrix=[[1,2],[3,4]]matrix[0][1]=10print(matrix)
3、增

常用 3 种方法,按需选择:

方法作用示例
append()末尾添加单个元素fruits.append("葡萄")
insert()指定索引位置添加元素fruits.insert(1, "梨")
extend()末尾合并另一个可迭代对象fruits.extend(["草莓", "荔枝"])

append 与 extend 区别append()加单个元素(包括列表),extend()合并可迭代对象。

fruits=["苹果","香蕉"]# append:末尾加单个元素fruits.append("橙子")print(fruits)# 输出:["苹果", "香蕉", "橙子"]# insert:索引1的位置加“梨”fruits.insert(1,"梨")print(fruits)# 输出:["苹果", "梨", "香蕉", "橙子"]# extend:合并另一个列表fruits.extend(["葡萄","草莓"])print(fruits)# 输出:["苹果", "梨", "香蕉", "橙子", "葡萄", "草莓"]# 注意:append加列表会把整个列表作为单个元素fruits.append(["芒果","荔枝"])print(fruits)# 输出:[...,"草莓", ["芒果", "荔枝"]]

如果是在列表的开头或者中间进行插入时,会时后续的所有元素都往后移动

4、删

常用 4 种方法,各有适用场景:

方法作用示例
del按索引删除(可删单个 / 切片),无返回值del fruits[1]/del fruits[1:3]
pop()按索引删除,返回被删元素(默认删末尾)fruits.pop()/fruits.pop(1)
remove()按值删除(删第一个匹配项)fruits.remove("香蕉")
clear()清空列表所有元素fruits.clear()

remove 只删第一个匹配项:列表中有多个相同元素时,remove()仅删除第一个

fruits=["苹果","梨","香蕉","橙子","香蕉"]# del:删除索引1的元素delfruits[1]print(fruits)# 输出:["苹果", "香蕉", "橙子", "香蕉"]# pop:删除末尾元素,返回“香蕉”last_fruit=fruits.pop()print(last_fruit)# 输出:香蕉print(fruits)# 输出:["苹果", "香蕉", "橙子"]# remove:删除第一个“香蕉”fruits.remove("香蕉")print(fruits)# 输出:["苹果", "橙子"]# clear:清空列表fruits.clear()print(fruits)# 输出:[]
常用内置方法
方法作用示例
len()统计列表长度(元素个数)len([1,2,3])→ 3
count()统计指定元素出现次数[1,2,2,3].count(2)→ 2
index()查找元素第一次出现的索引(找不到报错)[1,2,3].index(2)→ 1
sort()原地排序(修改原列表,默认升序)nums.sort()/nums.sort(reverse=True)
sorted()返回新的排序列表(不修改原列表)new_nums = sorted(nums)
reverse()原地反转列表(修改原列表)nums.reverse()

sort 是原地排序sort()会修改原列表,无返回值(不要写nums = nums.sort()

# 1. len():长度nums=[1,2,3,4,5]print(len(nums))# 输出:5# 2. count():统计次数nums=[1,2,2,3,2,4]print(nums.count(2))# 输出:3# 3. index():查找索引print(nums.index(3))# 输出:3# 4. sort():原地排序nums=[3,1,4,2,5]nums.sort()# 升序print(nums)# 输出:[1,2,3,4,5]nums.sort(reverse=True)# 降序print(nums)# 输出:[5,4,3,2,1]# 5. sorted():返回新列表(原列表不变)nums=[3,1,4,2]new_nums=sorted(nums)print(nums)# 输出:[3,1,4,2](原列表不变)print(new_nums)# 输出:[1,2,3,4]# 6. reverse():反转nums=[1,2,3]nums.reverse()print(nums)# 输出:[3,2,1]
列表进阶用法
遍历

for循环遍历列表元素,可直接遍历元素,也可遍历索引

fruits=["苹果","香蕉","橙子"]# 方式1:直接遍历元素(推荐)forfruitinfruits:print(f"我喜欢吃{fruit}")# 方式2:遍历索引(需要修改元素时用)foriinrange(len(fruits)):print(f"索引{i}的元素是:{fruits[i]}")# 方式3:同时遍历索引和元素(enumerate)foridx,fruitinenumerate(fruits):print(f"索引{idx}{fruit}")
列表推导式

Python 特有的高效语法,用一行代码创建列表,替代 “循环 + append”,新手也能快速上手。

语法:[表达式 for 变量 in 可迭代对象 if 条件]

# 创建1-10的列表(替代for+append)nums=[iforiinrange(1,11)]print(nums)# 输出:[1,2,3,4,5,6,7,8,9,10]# 创建1-10的偶数列表(加条件)even_nums=[iforiinrange(1,11)ifi%2==0]print(even_nums)# 输出:[2,4,6,8,10]# 将列表元素转为大写fruits=["apple","banana","orange"]upper_fruits=[fruit.upper()forfruitinfruits]print(upper_fruits)# 输出:["APPLE", "BANANA", "ORANGE"]
嵌套列表

列表里包含列表,常用于表示矩阵、表格等结构化数据:

# 二维列表(3行2列)matrix=[[1,2],[3,4],[5,6]]# 遍历嵌套列表forrowinmatrix:fornuminrow:print(num,end=" ")print()# 换行# 输出:# 1 2# 3 4# 5 6# 列表推导式处理嵌套列表(扁平化)flat_matrix=[numforrowinmatrixfornuminrow]print(flat_matrix)# 输出:[1,2,3,4,5,6]
列表操作的时间复杂度分析
操作平均时间复杂度最坏情况说明
索引访问lst[i]O(1)O(1)直接内存偏移
追加append()O(1)O(n)分摊O(1),扩容时O(n)
插入insert(0, x)O(n)O(n)需要移动所有元素
删除pop()O(1)O(1)移除最后一个元素
删除pop(0)O(n)O(n)需要移动所有元素
查找inO(n)O(n)线性搜索
切片lst[a:b]O(k)O(k)k = b-a

列表小练习

使用列表制作一个待办清单小程序,功能如下:

  1. 查看所有待办事项(列表遍历 / 查)
  2. 添加新的待办事项(列表增:append)
  3. 修改指定待办事项(列表改:索引赋值)
  4. 删除指定待办事项(列表删:pop)
  5. 退出程序

可以先自己思考一下怎么实现。

如果你熟悉数据结构,也可以考虑使用列表实现队列、栈等数据结构

实现代码如下(仅作参考):

# 基于列表的待办清单小程序# 初始化空列表存储待办事项todo_list=[]print("===== 欢迎使用待办清单小程序 =====")print("功能说明:")print("1 - 查看所有待办事项")print("2 - 添加待办事项")print("3 - 修改待办事项")print("4 - 删除待办事项")print("5 - 退出程序")print("===============================\n")# 主循环:保持程序运行,直到用户选择退出whileTrue:# 获取用户选择的功能try:choice=int(input("请输入你要执行的功能编号(1-5):"))exceptValueError:print("❌ 输入错误!请输入1-5之间的数字。\n")continue# 功能1:查看所有待办事项ifchoice==1:print("\n----- 你的待办清单 -----")ifnottodo_list:# 判断列表是否为空print("暂无待办事项,快去添加吧!")else:# 遍历列表,显示索引和待办事项(enumerate获取索引+元素)foridx,iteminenumerate(todo_list,start=1):print(f"{idx}.{item}")print("------------------------\n")# 功能2:添加待办事项elifchoice==2:item=input("请输入要添加的待办事项:").strip()ifnotitem:# 防止输入空字符串print("❌ 待办事项不能为空!\n")continuetodo_list.append(item)# 列表末尾添加元素print(f"✅ 已添加待办事项:{item}\n")# 功能3:修改待办事项elifchoice==3:ifnottodo_list:print("❌ 暂无待办事项,无法修改!\n")continue# 先显示当前待办事项,方便用户选择要修改的项print("\n----- 当前待办清单 -----")foridx,iteminenumerate(todo_list,start=1):print(f"{idx}.{item}")# 获取要修改的序号,并转换为列表索引(序号-1)try:modify_idx=int(input("请输入要修改的待办事项序号:"))-1ifmodify_idx<0ormodify_idx>=len(todo_list):print("❌ 序号不存在!\n")continueexceptValueError:print("❌ 输入错误!请输入数字序号。\n")continue# 输入新的待办事项并修改new_item=input("请输入修改后的待办事项:").strip()ifnotnew_item:print("❌ 待办事项不能为空!\n")continueold_item=todo_list[modify_idx]# 保存原内容,方便提示todo_list[modify_idx]=new_item# 列表索引赋值修改元素print(f"✅ 已将「{old_item}」修改为「{new_item}」\n")# 功能4:删除待办事项elifchoice==4:ifnottodo_list:print("❌ 暂无待办事项,无法删除!\n")continue# 先显示当前待办事项print("\n----- 当前待办清单 -----")foridx,iteminenumerate(todo_list,start=1):print(f"{idx}.{item}")# 获取要删除的序号try:del_idx=int(input("请输入要删除的待办事项序号:"))-1ifdel_idx<0ordel_idx>=len(todo_list):print("❌ 序号不存在!\n")continueexceptValueError:print("❌ 输入错误!请输入数字序号。\n")continue# 删除指定索引的元素,并提示del_item=todo_list.pop(del_idx)# pop删除并返回被删元素print(f"✅ 已删除待办事项:{del_item}\n")# 功能5:退出程序elifchoice==5:print("👋 感谢使用待办清单小程序,再见!")break# 输入无效编号else:print("❌ 功能编号错误!请输入1-5之间的数字。\n")

运行效果如下:

=====欢迎使用待办清单小程序=====功能说明:1- 查看所有待办事项2- 添加待办事项3- 修改待办事项4- 删除待办事项5- 退出程序===============================请输入你要执行的功能编号(1-5):1 ----- 你的待办清单 ----- 暂无待办事项,快去添加吧! ------------------------ 请输入你要执行的功能编号(1-5):2 请输入要添加的待办事项:写代码 ✅ 已添加待办事项:写代码 请输入你要执行的功能编号(1-5):1 ----- 你的待办清单 -----1. 写代码 ------------------------ 请输入你要执行的功能编号(1-5):2 请输入要添加的待办事项:写笔记 ✅ 已添加待办事项:写笔记 请输入你要执行的功能编号(1-5):1 ----- 你的待办清单 -----1. 写代码2. 写笔记 ------------------------ 请输入你要执行的功能编号(1-5):3 ----- 当前待办清单 -----1. 写代码2. 写笔记 请输入要修改的待办事项序号:1 请输入修改后的待办事项:写代码已完成 ✅ 已将「写代码」修改为「写代码已完成」 请输入你要执行的功能编号(1-5):1 ----- 你的待办清单 -----1. 写代码已完成2. 写笔记 ------------------------ 请输入你要执行的功能编号(1-5):4 ----- 当前待办清单 -----1. 写代码已完成2. 写笔记 请输入要删除的待办事项序号:2 ✅ 已删除待办事项:写笔记 请输入你要执行的功能编号(1-5):1 ----- 你的待办清单 -----1. 写代码已完成 ------------------------ 请输入你要执行的功能编号(1-5):5 👋 感谢使用待办清单小程序,再见! 进程已结束,退出代码为0

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询