← All · tech

5. 数据结构 5. 数据结构 — Python 3.14.4 文档

https://docs.python.org/zh-cn/3/tutorial/datastructures.html

📅 2026-04-16 📁 tech 🏷️ python, datastructures, programming
Python data structures tutorial

Linked skills: Job Radar, Github Ai Digest

url: "https://docs.python.org/zh-cn/3/tutorial/datastructures.html"

title: "5. 数据结构 5. 数据结构 — Python 3.14.4 文档"

date_saved: 2026-04-16

category: tech

tags: [python, datastructures, programming]

source: direct

reminder: false

cross_skills: [job-radar, github-ai-digest]

session_mention: always

url_hash: "146d9823dccc"

5. 数据结构 5. 数据结构 — Python 3.14.4 文档

**Summary**: Python data structures tutorial

Key Points

Content

主题 自动 明亮 黑暗 目录 5. 数据结构 5.1. 列表详解 5.1.1. 用列表实现堆栈 5.1.2. 用列表实现队列 5.1.3. 列表推导式 5.1.4. 嵌套的列表推导式 5.2. del 语句 5.3. 元组和序列 5.4. 集合 5.5. 字典 5.6. 循环的技巧 5.7. 深入条件控制 5.8. 序列和其他类型的比较 上一主题 4. 更多控制流工具 下一主题 6. 模块 当前页 报告代码错误 改进本页面 显示源码 显示翻译源 导航 索引 模块 | 下一页 | 上一页 | Python » 3.14.4 Documentation » Python 教程 » 5. 数据结构 | 主题 自动 明亮 黑暗 | 数据结构 ¶ 本章深入讲解之前学过的一些内容,同时,还增加了新的知识点。 5.1. 列表详解 ¶ 列表 数据类型具有更多的方法。 下面是列表对象的所有方法: list. append ( value , / ) 在列表末尾添加一项。 类似于 a[len(a):] = [x] 。 list. extend ( iterable , / ) 通过添加来自 iterable 的所有项来扩展列表。 类似于 a[len(a):] = iterable 。 list. insert ( index , value , / ) 在指定位置插入元素。第一个参数是插入元素的索引,因此, a.insert(0, x) 在列表开头插入元素, a.insert(len(a), x) 等同于 a.append(x) 。 list. remove ( value , / ) 从列表中移除第一个值为 value 的条目。 如果无此条目则会引发 ValueError 。 list. pop ( index = -1 , / ) 移除列表中给定位置上的条目,并返回该条目。 如果未指定索引号,则 a.pop() 将移除并返回列表中的最后一个条目。 如果列表为空或索引号在列表索引范围之外则会引发 IndexError 。 list. clear ( ) 移除列表中的所有项。 类似于 del a[:] 。 list. index ( value [ , start [ , stop ] ] ) 返回列表中 value 首次出现所在的从零开始的索引。 如无此条目则会引发 ValueError 。 可选参数 start 和 end 是切片符号,用于将搜索限制为列表的特定子序列。返回的索引是相对于整个序列的开始计算的,而不是 start 参数。 list. count ( value , / ) 返回列表中 value 出现的次数。 list. sort ( * , key = None , reverse = False ) 就地排序列表中的元素(要了解自定义排序参数,详见 sorted() )。 list. reverse ( ) 翻转列表中的元素。 list. copy ( ) 返回列表的浅拷贝。 类似于 a[:] 。 多数列表方法示例: >>> fruits = [ 'orange' , 'apple' , 'pear' , 'banana' , 'kiwi' , 'apple' , 'banana' ] >>> fruits . count ( 'apple' ) 2 >>> fruits . count ( 'tangerine' ) 0 >>> fruits . index ( 'banana' ) 3 >>> fruits . index ( 'banana' , 4 ) # 从 4 号位开始查找下一个 banana 6 >>> fruits . reverse () >>> fruits ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange'] >>> fruits . append ( 'grape' ) >>> fruits ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape'] >>> fruits . sort () >>> fruits ['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear'] >>> fruits . pop () 'pear' 你可能已经注意到 insert , remove 或 sort 等仅修改列表的方法都不会打印返回值 -- 它们返回默认值 None 。 [ 1 ] 这是适用于 Python 中所有可变数据结构的设计原则。 你可能会注意到的另一件事是并非所有数据都可以排序或比较。 举例来说, [None, 'hello', 10] 就不可排序因为整数不能与字符串比较而 None 不能与其他类型比较。 此外,还存在一些没有定义顺序关系的类型。 例如, 3+4j < 5+7j 就不是一个合法的比较。 5.1.1. 用列表实现堆栈 ¶ 列表方法使得将列表作为栈来使用非常容易,最后添加的元素会最先被取出(“后进先出”)。 要将一个条目添加到栈顶,可使用 append() 。 要从栈顶取出一个条目,则使用 pop() 而不必显式指定索引。 例如: >>> stack = [ 3 , 4 , 5 ] >>> stack . append ( 6 ) >>> stack . append ( 7 ) >>> stack [3, 4, 5, 6, 7] >>> stack . pop () 7 >>> stack [3, 4, 5, 6] >>> stack . pop () 6 >>> stack . pop () 5 >>> stack [3, 4] 5.1.2. 用列表实现队列 ¶ 列表也可以用作队列,最先加入的元素,最先取出(“先进先出”);然而,列表作为队列的效率很低。因为,在列表末尾添加和删除元素非常快,但在列表开头插入或移除元素却很慢(因为所有其他元素都必须移动一位)。 实现队列最好用 collections.deque ,可以快速从两端添加或删除元素。例如: >>> from collections import deque >>> queue = deque ([ "Eric" , "John" , "Michael" ]) >>> queue . append ( "Terry" ) # Terry 到了 >>> queue . append ( "Graham" ) # Graham 到了 >>> queue . popleft () # 第一个到的现在走了 'Eric' >>> queue . popleft () # 第二个到的现在走了 'John' >>> queue # 按到达顺序排列的剩余队列 deque(['Michael', 'Terry', 'Graham']) 5.1.3. 列表推导式 ¶ 列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。 例如,创建平方值的列表: >>> squares = [] >>> for x in range ( 10 ): ... squares . append ( x ** 2 ) ... >>> squares [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 注意,这段代码创建(或覆盖)变量 x ,该变量在循环结束后仍然存在。下述方法可以无副作用地计算平方列表: squares = list ( map ( lambda x : x ** 2 , range ( 10 ))) 或等价于: squares = [ x ** 2 for x in range ( 10 )] 上面这种写法更简洁、易读。 列表推导式的方括号内包含以下内容:一个表达式,后面为一个 for 子句,然后,是零个或多个 for 或 if 子句。结果是由表达式依据 for 和 if 子句求值计算而得出一个新列表。 举例来说,以下列表推导式将两个列表中不相等的元素组合起来: >>> [( x , y ) for x in [ 1 , 2 , 3 ] for y in [ 3 , 1 , 4 ] if x != y ] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 等价于: >>> combs = [] >>> for x in [ 1 , 2 , 3 ]: ... for y in [ 3 , 1 , 4 ]: ... if x != y : ... combs . append (( x , y )) ... >>> combs [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 注意,上面两段代码中, for 和 if 的顺序相同。 表达式是元组(例如上例的 (x, y) )时,必须加上括号: >>> vec = [ - 4 , - 2 , 0 , 2 , 4 ] >>> # 新建一个将值翻倍的列表 >>> [ x * 2 for x in vec ] [-8, -4, 0, 4, 8] >>> # 过滤列表以排除负数 >>> [ x for x in vec if x >= 0 ] [0, 2, 4] >>> # 对所有元素应用一个函数 >>> [ abs ( x ) for x in vec ] [4, 2, 0, 2, 4] >>> # 在每个元素上调用一个方法 >>> freshfruit = [ ' banana' , ' loganberry ' , 'passion fruit ' ] >>> [ weapon . strip () for weapon in freshfruit ] ['banana', 'loganberry', 'passion fruit'] >>> # 创建一个包含 (数字, 平方) 2 元组的列表 >>> [( x , x ** 2 ) for x in range ( 6 )] [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)] >>> # 元组必须加圆括号,否则会引发错误 >>> [ x , x ** 2 for x in range ( 6 )] File "<stdin>" , line 1 [ x , x ** 2 for x in range ( 6 )] ^^^^^^^ SyntaxError : did you forget parentheses around the comprehension target? >>> # 使用两个 'for' 来展平嵌套的列表 >>> vec = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]] >>> [ num for elem in vec for num in elem ] [1, 2, 3, 4, 5, 6, 7, 8, 9] 列表推导式可以使用复杂的表达式和嵌套函数: >>> from math import pi >>> [ str ( round ( pi , i )) for i in range ( 1 , 6 )] ['3.1', '3.14', '3.142', '3.1416', '3.14159'] 5.1.4. 嵌套的列表推导式 ¶ 列表推导式中的初始表达式可以是任何表达式,甚至可以是另一个列表推导式。 下面这个 3x4 矩阵,由 3 个长度为 4 的列表组成: >>> matrix = [ ... [ 1 , 2 , 3 , 4 ], ... [ 5 , 6 , 7 , 8 ], ... [ 9 , 10 , 11 , 12 ], ... ] 下面的列表推导式可以转置行列: >>> [[ row [ i ] for row in matrix ] for i in range ( 4 )] [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 如我们在之前小节中看到的,内部的列表推导式是在它之后的 for 的上下文中被求值的,所以这个例子等价于: >>> transposed = [] >>> for i in range ( 4 ): ... transposed . append ([ row [ i ] for row in matrix ]) ... >>> transposed [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 反过来说,也等价于: >>> transposed = [] >>> for i in range ( 4 ): ... # 以下 3 行实现了嵌套的列表推导式 ... transposed_row = [] ... for row in matrix : ... transposed_row . append ( row [ i ]) ... transposed . append ( transposed_row ) ... >>> transposed [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 实际应用中,最好用内置函数替代复杂的流程语句。此时, zip() 函数更好用: >>> list ( zip ( * matrix )) [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] 关于本行中星号的详细说明,参见 解包实参列表 。 5.2. del 语句 ¶ 可以按索引而不是按值从一个列表移除条目:即使用 del 语句。 这不同于返回一个值的 pop() 方法。 del 语句还可被用来从列表移除切片或清空整个列表(之前我们通过将一个空列表赋值给切片实现此功能)。 例如: >>> a = [ - 1 , 1 , 66.25 , 333 , 333 , 1234.5 ] >>> del a [ 0 ] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a [ 2 : 4 ] >>> a [1, 66.25, 1234.5] >>> del a [:] >>> a [] del 也可以用来删除整个变量: >>> del a 此后,再引用 a 就会报错(直到为它赋与另一个值)。后文会介绍 del 的其他用法。 5.3. 元组和序列 ¶ 列表和字符串有很多共性,例如,索引和切片操作。这两种数据类型是 序列 (参见 序列类型 --- list, tuple, range )。随着 Python 语言的发展,其他的序列类型也被加入其中。本节介绍另一种标准序列类型: 元组 。 元组由多个用逗号隔开的值组成,例如: >>> t = 12345 , 54321 , 'hello!' >>> t [ 0 ] 12345 >>> t (12345, 54321, 'hello!') >>> # 元组可以嵌套: >>> u = t , ( 1 , 2 , 3 , 4 , 5 ) >>> u ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) >>> # 元组是不可变对象: >>> t [ 0 ] = 88888 Traceback (most recent call last): File "<stdin>" , line 1 , in <module> TypeError : 'tuple' object does not support item assignment >>> # 但它们可以包含可变对象: >>> v = ([ 1 , 2 , 3 ], [ 3 , 2 , 1 ]) >>> v ([1, 2, 3], [3, 2, 1]) 输出时,元组都要由圆括号标注,这样才能正确地解释嵌套元组。输入时,圆括号可有可无,不过经常是必须的(如果元组是更大的表达式的一部分)。不允许为元组中的单个元素赋值,当然,可以创建含列表等可变对象的元组。 虽然,元组与列表很像,但使用场景不同,用途也不同。元组是 immutable (不可变的),一般可包含异质元素序列,通过解包(见本节下文)或索引访问(如果是 namedtuples ,可以属性访问)。列表是 mutable (可变的),列表元素一般为同质类型,可迭代访问。 构造 0 个或 1 个元素的元组比较特殊:为了适应这种情况,对句法有一些额外的改变。用一对空圆括号就可以创建空元组;只有一个元素的元组可以通过在这个元素后添加逗号来构建(圆括号里只有一个值的话不够明确)。丑陋,但是有效。例如: >>> empty = () >>> singleton = 'hello' , # <-- 注意末尾的逗号 >>> len ( empty ) 0 >>> len ( singleton ) 1 >>> singleton ('hello',) 语句 t = 12345, 54321, 'hello!' 是 元组打包 的例子:值 12345 , 54321 和 'hello!' 一起被打包进元组。逆操作也可以: >>> x , y , z = t 称之为 序列解包 也是妥妥的,适用于右侧的任何序列。序列解包时,左侧变量与右侧序列元素的数量应相等。注意,多重赋值其实只是元组打包和序列解包的组合。 5.4. 集合 ¶ Python 还包括一个表示 集合 的数据类型。 集合是由不重复元素组成的无序多项集。 基本用法包括成员检测和消除重复元素。 集合对象还支持合集、交集、差集和对称差集等数学运算。 创建集合用花括号或 set() 函数。注意,创建空集合只能用 set() ,不能用 {} , {} 创建的是空字典,下一小节介绍数据结构:字典。 由于集合是无序的,在迭代或打印它们时可能会以不符合你预期的顺序输出元素。 以下是一些简单的示例 >>> basket = { 'apple' , 'orange' , 'apple' , 'pear' , 'orange' , 'banana' } >>> print ( basket ) # 显示重复项已被移除 {'orange', 'banana', 'pear', 'apple'} >>> 'orange' in basket # 快速成员检测 True >>> 'crabgrass' in basket False >>> # 演示针对两个单词中独有的字母进行集合运算 >>> >>> a = set ( 'abracadabra' ) >>> b = set ( 'alacazam' ) >>> a # a 中独有的字母 {'a', 'r', 'b', 'c', 'd'} >>> a

Images

![image-0](https://docs.python.org/zh-cn/3/_static/py.svg)

![image-1](https://docs.python.org/zh-cn/3/_static/py.svg)

![image-2](https://docs.python.org/zh-cn/3/_static/py.svg)

Related Skills