列表:Python 描述

#数据结构/列表 #数据结构

列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。

许多编程语言中的标准库提供的列表是基于动态数组实现的,例如

  • Python 中的 list 
  • Java 中的 ArrayList
  • Js 的 Array

目录

1. 初始化与更新

############################## ### 初始化列表 ############################## num1:list[int] = [1, 2, 3, 4, 5] ######### 列表的访问:复杂度为 O(1) print(num1[0]) # 查 num1[0] = 0 # 更新

2. 列表的插入:复杂度为 O(n)

############################## ### 列表的插入:复杂度为 O(n) ############################## # 清空列表 num1.clear() # 头部插入 # insert(index, value) index 为插入的位置,value 为插入的值 num1.insert(0, 1) # 复杂度为 O(n) # 尾部插入 num1.append(2) # 复杂度为 O(1) # 中间插入 num1.insert(1, 3) # 复杂度为 O(n)

3. 列表的遍历:复杂度为 O(n)

############################## ### 列表的遍历:复杂度为 O(n) ############################## # 方式一 for i in num1: print(i) # 方式二 for i in range(len(num1)): print(num1[i])

4. 拼接列表

############################## ### 拼接列表 ############################## num1 = [1, 2, 3, 4, 5] num2 = [6, 7, 8, 9, 10] # 方式一:使用 extend 方法 # ## 缺点:改变了原始的 num1 num1.extend(num2) # 方式二:使用 + 运算符 ### 缺点:创建了新的列表 new_list = num1 + num2 # 方式三:使用 * 运算符和列表解包 ### 缺点:不适用于大列表,在 Python 3.5 之前的版本中不支持 new_list = [*num1, *num2] # 方式四:使用列表解析 ### 缺点:不适用于大列表 new_list = [i for i in num1] + [i for i in num2] result = [item for list in (num1, num2) for item in list]

4.1. 关于列表解析的说明

图片

4.2. 列表的删除

############################## ### 列表的删除:复杂度为 O(n) ############################## num1 = [1, 2, 3, 4, 5] # remove 方法: 删除第一个匹配的元素,如果没有找到会报错 # remove(item) item 为需要删除的元素 num1.remove(3) # 删除第一个 3 # pop 方法: 删除指定索引的元素,参数为索引 num1.pop(1) # 删除索引为 1 的元素 # clear 方法: 清空列表 num1.clear() # del 方法: 删除指定索引的元素,参数为索引 del num1[1] # 删除索引为 1 的元素 # 删除整个列表 del num1

5. 列表的排序

############################## ### 列表的排序 ############################## num1 = [1, 3, 2, 5, 4] num1.sort() # 默认升序 num1.sort(reverse=True) # 降序

6. 列表的实现原理

许多编程语言内置了列表,例如 Java、C++、Python 等。它们的实现比较复杂,各个参数的设定也非常考究,例如初始容量、扩容倍数等。

为了加深对列表工作原理的理解,我们尝试实现一个简易版列表,包括以下三个重点设计。

  • 初始容量:选取一个合理的数组初始容量。
  • 数量记录:声明一个变量 size ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据此变量,我们可以定位列表尾部,以及判断是否需要扩容。
  • 扩容机制:若插入元素时列表容量已满,则需要进行扩容。先根据扩容倍数创建一个更大的数组,再将当前数组的所有元素依次移动至新数组。
    • 比如设置扩容倍数