【大模型2609·Python基础·04】数据容器精讲(上):列表List、字符串Str与元组Tuple

【大模型2609·Python基础·04】数据容器精讲(上):列表List、字符串Str与元组Tuple
kikock专栏导读:容器是处理结构化数据的基石。本篇专注解析序列类型(Sequence Types)的核心设计,深度对比可变序列(列表 List)与不可变序列(字符串 Str、元组 Tuple)。内容包含底层内存模型、切片步长机制、常用内置高频方法及不可变对象的安全性设计。
第5章 Python的容器类型
5.1 容器概述
Python 提供了多种内置的容器类型,用于存储和组织数据。内置的主要容器类型有:列表list、元组tuple、字符串str、集合set、字典dict等,另外Python还在collections模块中提供了更多容器类型,例如:双端队列deque等。
5.1.1 常见容器类型
常见容器类型区别:
| 类型 | 示例 | 可变性 | 有序性 | 重复元素 | 使用场景 |
|---|---|---|---|---|---|
| 列表(list) | [1, 2, 3] |
可变 | 有序 | 允许 | 有序数据集合,需要修改 |
| 集合(set) | {1, 2, 3} |
可变 | 无序 | 不允许 | 唯一元素集合,集合运算 |
| 字典(dict) | {'a': 1, 'b': 2} |
可变 | 无序 | 键唯一 | 键值对映射,快速查找 |
| 字节数组(bytearray) | bytearray(b'hello') |
可变 | 有序 | 允许 | 需要存储和处理二进制数据 |
| 范围(range) | range(5) |
不可变 | 有序 | 允许 | 表示数字序列,节省内存 |
| 字符串(str) | 'hello' |
不可变 | 有序 | 允许 | 文本处理,字符序列 |
| 元组(tuple) | (1, 2, 3) |
不可变 | 有序 | 允许 | 固定数据集合,字典键 |
| 字节串(bytes) | b'hello' |
不可变 | 有序 | 允许 | 不可变二进制数据 |
| 冻结集合(frozenset) | frozenset([1, 2, 3]) |
不可变 | 无序 | 不允许 | 不可变集合,字典键 |
1 | # ------------------可变容器----------------------- |
1 | # ------------------不可变容器----------------------- |
5.1.2 容器通用基础操作
- 检查元素x是否为容器中的成员:x in container
- 获取容器的长度:len(container)
- 遍历容器:for x in container:
- 容器:找最大值max(container)、最小值min(container)
- 容器元素求累加和:sum(container)
要求元素是数值类型
1 | """ |
5.2 序列类型
说明:序列(sequence)类型是有序的容器,支持索引访问。常见的序列类型包括:列表(List)、字符串(String)、元组(Tuple)等
元素:有序、可重复
5.2.1 序列类型通用的操作
- 根据索引方式访问序列的元素:例如sequence[0]
- 通过切片方式访问序列的元素:例如sequence[1:3]
- [ start : end ],步长为1,复制[start, end)范围的元素。start缺省表示从0开始,end缺省表示到末尾。
- [start :: step],start是起始下标。步长为step的绝对值。step为正数,表示正序,start缺省表示从0开始。step为负数,表示倒序,start缺省表示从末尾开始。
- 获取元素x的索引:sequence.index(x)
- 序列拼接相加:sequence1 + sequence2
- 序列乘法:sequence1 * n
- 元素x数量统计:sequence.count(x)
- 遍历列表元素:x代表元素,i代表元素索引,sequence代表序列
- for x in sequence
- for i in range(len(sequence))
- for i,x in enumerate(sequence)
1 | words = ["hello", "world", "python","atguigu","ai"] |
5.2.2 列表(有序可变[])
- 列表是一个可变的集合,是一个元素有序、可重复的序列。
- 列表使用 [] 定义,数据之间使用 , 分隔。
- 列表中每个元素都有对应的位置值,称为索引或下标,索引值:从左往右从0开始逐个向后递增,从右往左从-1开始逐个向前递减。
- 列表中元素可以是不同的类型。
1、创建列表
1 | # 创建列表 |
2、容器、序列通用操作
1 | # 检查成员是否为列表中的元素 |
3、向列表添加元素
1 | # 列表添加元素 |
4、删除列表元素
1 | # 列表删除元素 |
5、修改列表中的元素
1 | # 列表元素修改 |
6、列表排序、反转
1 | listDemo = [3, 5, 8, 6, 3, 3, 9, 3, 7] |
7、列表嵌套
列表中元素可以为列表。
1 | # 列表嵌套 |
8、语法糖之一:列表推导式
列表推导式是 Python 中一种简洁创建列表的方式,它将一个可迭代对象(如列表、元组、集合、字符串等)的元素通过某种运算或条件筛选后生成一个新的列表。
Python仅原生支持 4 种推导式 / 表达式:(其他推导式请看后面相关内容)
- 列表推导式:
[表达式 for 元素 in 可迭代对象]→ 直接生成列表 - 集合推导式:
{表达式 for 元素 in 可迭代对象}→ 直接生成集合 - 字典推导式:
{键:值 for 元素 in 可迭代对象}→ 直接生成字典 - 生成器表达式:
(表达式 for 元素 in 可迭代对象)→ 生成生成器
1 | # 列表推导式 |
1 | # (2)列表推导式中添加条件 |
1 | # (3)包含多个循环的列表推导式 |
1、什么是语法糖
语法糖(Syntactic Sugar)是编程语言中的一种特性,它指的是在不影响语言功能的前提下,为程序员提供更简洁、更易读的语法形式。语法糖本身并不增加语言的功能,而是让代码更容易编写和理解。语法糖的特点:
- 简化代码:让复杂的操作用更简单的语法表达。
- 提高可读性:使代码更接近自然语言或逻辑思维。
- 不改变语义:语法糖只是对底层实现的封装,不会影响程序的实际行为。
2、python中的语法糖有很多,例如:
- for循环:底层是迭代器,请看后续小节
- 推导式:底层是产生列表、集合、字典、生成器的代码
- 装饰器:底层是函数包装,请看后续小节
1 | # 普通写法 |
9、zip函数
zip 函数用于将多个可迭代对象打包成一个迭代器,将对应位置的元素组合成元组。
1 | # zip函数 |
1 | # 解压操作 |
10、常用函数
| 函数 | 说明 |
|---|---|
| list.insert(index,x) | 在指定位置插入x |
| list.append(x) | 在列表末尾追加x |
| list1.extend(list2) | 在列表1的末尾追加列表2的数据 |
| del list[index] | 删除指定位置的数据或切片 |
| list.remove(x) | 删除第一次出现的x |
| list.pop([index]) | 删除指定位置的数据,默认为末尾数据 |
| list.clear() | 清空列表中元素 |
| list[index] = x | 修改指定位置的数据 |
| list1[start:end] = list2 | 修改列表切片的数据 |
| sorted(list[,reverse=True]) | 返回排序后的新列表,可选降序 |
| list.sort([reverse=True]) | 对列表就地排序,可选降序 |
| list.reverse() | 反转列表中的元素 |
| list.index(x[,start,[,end]]) | 返回x在列表中首次出现的位置,可指定起始和结束范围 |
| list.count(x) | 返回x的数量 |
| len(list) | 返回列表元素个数 |
| max(list) | 返回列表中最大值 |
| min(list) | 返回列表中最小值 |
| sum(list) | 返回列表中所有元素和 |
| list.copy() | 拷贝列表 |
| list(x) | 将序列转换为列表 |
5.2.3 字符串(有序不可变)
- 字符串是不可变的、有序的。
- 字符串中元素不可修改。
- 字符串使用单引号、双引号或三重引号定义。
- 字符串中每个元素都有对应的位置值,称为索引或下标,索引值:从左往右从0开始逐个向后递增,从右往左从-1开始逐个向前递减。
字符串对象不可变,字符串没有append,insert,remove,replace、sort、reverse等操作方法
1、创建字符串
1 | # 创建字符串 |
2、容器、序列相同的操作
(1)容器通用操作
- 检查元素x是否为容器中的成员:x in container
- 获取容器的长度:len(container)
- 遍历容器:for x in container:
- 容器:找最大值max(container)、最小值min(container)
- 容器元素求累加和:sum(container)
要求元素是数值类型
(2)序列通用操作
访问序列的元素
- 根据索引方式访问序列的元素:例如sequence[0]
- 通过切片方式访问序列的元素:例如sequence[1:3]
获取元素x的索引:sequence.index(x)
序列拼接相加:sequence1 + sequence2
序列乘法:sequence1 * n
元素x数量统计:sequence.count(x)
遍历列表元素:x代表元素,i代表元素索引,sequence代表序列
- for x in sequence
- for i in range(len(sequence))
- for i,x in enumerate(sequence)
1 | # 检查成员是否为字符串中的元素 |
3、原始字符串
所有的字符串按照字面意思处理,没有转义字符。需在字符串前加上r / R。
1 | # 原始字符串 |
4、常用函数
| 函数 | 说明 |
|---|---|
| str.replace(old,new[,max]) | 把将字符串中的old替换成new,如果指定max,则替换不超过max次 |
| str.split([x][,n]) | 按x分隔字符串,默认按任何空白字符串分隔并在结果中丢弃空字符串。可指定最大分隔次数 |
| str.rsplit([x][,n]) | 与split()类似,从右边开始分隔 |
| x.join(seq) | 以x作为分隔符,将序列中所有的字符串合并为一个新的字符串 |
| str.strip([x]) | 截掉字符串两边的空格或指定字符 |
| str.lstrip([x]) | 截掉字符串左边的空格或指定字符 |
| str.rstrip([x]) | 截掉字符串右边的空格或指定字符 |
| str.removeprefix() | 截掉字符串指定前缀 |
| str.removesuffix() | 截掉字符串指定后缀 |
| str.upper() | 将所有字符转为大写 |
| str.lower() | 将所有字符转为小写 |
| str.swapcase() | 反转字符串中字母大小写 |
| str.capitalize() | 将字符串第一个字母变为大写,其他字母变为小写 |
| str.title() | 将字符串每个单词首字母大写 |
| len(str) | 返回字符串长度 |
| max(str) | 返回字符串中最大值 |
| min(str) | 返回字符串中最小值 |
| str.find(x[,start][,end]) | 返回字符串中第一个x的索引值,不存在则返回-1,可指定字符串开始结束范围 |
| str.rfind(x[,start][,end]) | 与find()类似,从右边开始查找 |
| str.index(x[,start][,end]) | 返回字符串中第一个x的索引值,不存在则报错,可指定字符串开始结束范围 |
| str.rindex(x[,start][,end]) | 与index()类似,从右边开始查找 |
| str.count(x[,start][,end]) | 返回字符串中x的个数,可指定字符串开始结束范围 |
| str.startswith(x[,start][,end]) | 检查字符串是否以x开头,可指定字符串开始结束范围 |
| str.endswith(x[,start][,end]) | 检查字符串是否以x结尾,可指定字符串开始结束范围 |
| str.isspace() | 检查字符串是否非空且只包含空白 |
(1)字符串替换
1 | # 字符串替换 |
(2)多个字符串连接
1 | # 多个字符串连接 |
(3)字符串中查找子字符串
1 | # find() 方法检测字符串中是否包含子字符串,如果包含则返回子字符串开始的索引值,否则返回 -1。 |
(4)字符串拆分
1 | # split() 方法通过指定分隔符对字符串进行切片,并返回分割后的列表。 |
(5)去掉首或尾的部分
1 | # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符) |
(6)转大小写
1 | # upper() 方法将字符串中的所有小写字母转换为大写字母 |
5、其他函数
| 函数 | 说明 |
|---|---|
| str.center(width[,x]) | 返回长度为width且居中的字符串,空白使用x填充,默认为空格 |
| str.ljust(width[,x]) | 返回长度为width且左对齐的字符串,空白使用x填充,默认为空格 |
| str.rjust(width[,x]) | 返回长度为width且右对齐的字符串,空白使用x填充,默认为空格 |
| str.zfill(width) | 返回长度为width且右对齐的字符串,空白使用0填充 |
| str.splitlines([keepends]) | 按行分隔字符串,返回每行字符串组成的列表,可选是否保留换行符 |
| str.partition(x) | 使用x将字符串分隔为3部分,如果分隔后不足3部分或字符串中没有x则以空白填充 |
| str.rpartition(x) | 与partition()类似,从右边开始分隔 |
| str.encode(encoding=’UTF-8’,errors=’strict’) | 对字符串使用指定格式编码,并指定错误处理方案 |
| str.expandtabs([tabsize]) | 将字符串中\t转化为空格,可指定每个\t空格数 |
| str.format_map(dict) | 使用字典等映射关系数据来格式化字符串 |
| str.isalnum() | 检查字符串是否非空且只包含字母(英文字母+汉字)和数字 |
| str.isalpha() | 检查字符串是否非空且只包含字母(英文字母+汉字) |
| str.isascii() | 检查字符串是否只包含ASCII字符,空字符串也是ASCII |
| str.isdecimal() | 检查字符串是否非空且只包含十进制字符 |
| str.isdigit() | 检查字符串是否非空且只包含数字 |
| str.isidentifier() | 检查字符串是否是有效的标识符 |
| str.isupper() | 检查字符串中是否包含至少一个区分大小写的字符,且所有这些(区分大小写的)字符都是大写 |
| str.islower() | 检查字符串中是否包含至少一个区分大小写的字符,且所有这些(区分大小写的)字符都是小写 |
| str.isnumeric() | 检查字符串是否非空且只包含数值字符 |
| str.isprintable() | 检查字符串是否可打印 |
| str.istitle() | 检查字符串是否非空且符合title格式 |
| str.maketrans(str1,str2[,str3]) | 生成翻译表供translate()使用。如果只传一个参数,它必须是将Unicode序号(整数)或字符映射到Unicode序号、字符串或None的字典。然后,字符键将转换为序数。如果传两个参数,需要str1和str2为等长的字符串,并且在生成的字典中,str1中的每个字符都将映射到str2中相同位置的字符。如果有第三个参数,它必须是一个字符串,其字符将在结果中映射到None |
| str.translate() | 使用给定的翻译表替换字符串中的每个字符 |
(1)字符串填充
1 | # center() 方法返回一个指定宽度并居中对齐的字符串,两侧使用指定字符填充 |
(2)字符串分割
1 | # splitlines() 方法按照行('\r', '\n', '\r\n')分割字符串,返回包含各行的列表 |
(3)字符串格式化
1 | # format_map() 方法使用字典作为参数来格式化字符串 |
(5)字符串翻译
1 | # maketrans() 方法创建字符映射表,用于字符替换 |
5.2.4 元组(有序不可变())
- 元组(tuple)是一个不可变的、有序的元素集合。
- 不能对元组中的元素进行修改操作。
- 元组使用 () 定义,数据之间使用,分隔。
- 元组中每个元素都有对应的位置值,称为索引或下标,索引值:从左往右从0开始逐个向后递增,从右往左从-1开始逐个向前递减。
- 元组中元素可以是不同的类型。
- 元组的使用方式与列表类似。
1、创建元组
1 | # 创建元组 |
2、容器、序列类型相同的操作
(1)容器通用操作
- 检查元素x是否为容器中的成员:x in container
- 获取容器的长度:len(container)
- 遍历容器:for x in container:
- 容器:找最大值max(container)、最小值min(container)
(2)序列通用操作
访问序列的元素
- 根据索引方式访问序列的元素:例如sequence[0]
- 通过切片方式访问序列的元素:例如sequence[1:3]
获取元素x的索引:sequence.index(x)
序列拼接相加:sequence1 + sequence2
序列乘法:sequence1 * n
元素x数量统计:sequence.count(x)
遍历列表元素:x代表元素,i代表元素索引,sequence代表序列
- for x in sequence
- for i in range(len(sequence))
- for i,x in enumerate(sequence)
1 | # 检查成员是否为元组中的元素 |
3、元组不可变
1 | # --------------元组不可变------------------- |







