当前位置: 首页 > news >正文

Python数据容器介绍(列表、元组、字符串、集合、字典)

        在 Python 中,列表(List)、元组(Tuple)、字符串(String)、集合(Set)、字典(Dictionary) 是最常用的 5 种数据容器,它们各自具备独特的结构、特性和适用场景,理解其差异是高效编程的核心基础。


目录

一、各容器核心特性总览

二、分容器详细解析(附代码示例)

1. 列表(List):动态可变的有序集合

核心特点

适用场景

2. 元组(Tuple):不可变的有序集合

核心特点

适用场景

3. 字符串(String):不可变的字符序列

核心特点

适用场景

4. 集合(Set):无序无重复的数学集合

核心特点

适用场景

5. 字典(Dictionary):键值映射的无序(3.7 + 有序)集合

核心特点

适用场景

三、关键区别总结(避坑指南)

四、容器选择决策树(快速选型)


一、各容器核心特性总览

容器类型语法标识是否可变是否有序元素特点索引方式核心优势
列表(List)[] 或 list()可重复、可混合类型整数索引(0 开始)灵活增删改查,动态调整
元组(Tuple)() 或 tuple()可重复、可混合类型整数索引(0 开始)不可篡改,内存占用少
字符串(String)""'' 或 str()仅字符、不可重复(逻辑上)整数索引(0 开始)文本处理,内置丰富方法
集合(Set){} 或 set()不可重复、无混合类型限制无索引(需迭代)去重、交集 / 并集等数学运算
字典(Dict){k:v} 或 dict()是(值可改)3.7+版本 有序键唯一(不可变类型)、值可重复键索引(如 dict[k]键值映射,快速查询

二、分容器详细解析(附代码示例)

1. 列表(List):动态可变的有序集合

列表是 Python 最灵活的容器之一,适合存储 “需要频繁修改的有序数据”。

核心特点
  • 可变性:支持增(append)、删(pop)、改(list[i] = new)、查(list[i])元素。
  • 有序性:元素按插入顺序排列,支持整数索引(正索引从 0 开始,负索引从 -1 开始,如 list[-1] 取最后一个元素)。
  • 元素特性:可存储任意类型(整数、字符串、列表等),且允许重复元素。
  • 内存占用:因支持动态扩容,内存占用略高于元组。
# 1. 定义列表(混合类型、重复元素)
student_list = ["Tom", 20, "Male", 90.5, "Tom"]  # 允许重复(两个"Tom")、混合类型
print("原始列表:", student_list)  # 输出:['Tom', 20, 'Male', 90.5, 'Tom']# 2. 增:在末尾添加元素
student_list.append("Python")
print("添加后:", student_list)  # 输出:['Tom', 20, 'Male', 90.5, 'Tom', 'Python']# 3. 改:修改索引1的元素(原20→21)
student_list[1] = 21
print("修改后:", student_list)  # 输出:['Tom', 21, 'Male', 90.5, 'Tom', 'Python']# 4. 删:删除索引3的元素(90.5)
student_list.pop(3)
print("删除后:", student_list)  # 输出:['Tom', 21, 'Male', 'Tom', 'Python']# 5. 查:通过索引取元素(负索引-1取最后一个)
print("最后一个元素:", student_list[-1])  # 输出:Python
适用场景
  • 存储需要动态调整的数据(如用户输入的列表、日志记录)。
  • 需按顺序访问的数据(如排行榜、任务队列)。
  • 临时存储多个同类 / 不同类数据(如函数返回的多值结果)。

2. 元组(Tuple):不可变的有序集合

元组是列表的 “不可变版本”,适合存储 “不允许修改的有序数据”,安全性更高。

核心特点
  • 不可变性:一旦创建,元素的个数、值、顺序均无法修改(无 append/pop 方法,也不能直接赋值 tuple[i] = new)。
  • 有序性:同列表,支持整数索引,元素按插入顺序排列。
  • 元素特性:可存储任意类型、允许重复元素(与列表一致)。
  • 内存优化:不可变特性使其无需预留扩容空间,内存占用比列表少 10%-20%;创建速度也比列表快。
  • 特殊语法:单元素元组需加逗号(如 (1,)),否则会被解析为普通括号(如 (1) 是整数 1)。
# 1. 定义元组(单元素需加逗号,多元素正常)
user_info = ("Jerry", 22, "Female")  # 多元素元组
single_tuple = (3.14,)  # 单元素元组(必须加逗号)
print("用户信息:", user_info)  # 输出:('Jerry', 22, 'Female')
print("单元素元组:", single_tuple)  # 输出:(3.14,)# 2. 查:支持索引访问(同列表)
print("用户名:", user_info[0])  # 输出:Jerry
print("年龄:", user_info[1])    # 输出:22# 3. 不可修改:以下代码会报错(TypeError)
# user_info[1] = 23  # 禁止修改元素
# user_info.append("Java")  # 元组无append方法# 4. 可迭代:可用于for循环
for item in user_info:print(item, end=" ")  # 输出:Jerry 22 Female
适用场景
  • 存储固定不变的数据(如配置信息、坐标 (x, y)、日期 (2024, 5, 20))。
  • 函数返回多值时的默认类型(如 return a, b 实际返回 (a, b) 元组)。
  • 作为字典的键(因不可变,列表不能作为字典键,但元组可以)。
  • 需保障数据安全性的场景(防止误修改)。

3. 字符串(String):不可变的字符序列

字符串本质是 “字符的有序集合”,专门用于处理文本数据,是 Python 中最常用的类型之一。

核心特点
  • 不可变性:同元组,字符不能直接修改(如 s[0] = 'A' 会报错),需通过切片生成新字符串。
  • 有序性:支持整数索引(同列表 / 元组),可按位置访问单个字符。
  • 元素特性:仅存储字符(Unicode 编码,支持中文、特殊符号),逻辑上无重复限制(如 "aab" 是合法字符串)。
  • 内置方法丰富:提供 40+ 个文本处理方法(如 split 分割、replace 替换、upper 转大写),无需手动实现。
# 1. 定义字符串(单引号、双引号、三引号均可)
text = "Hello, Python!"
multi_line = """这是
多行
字符串"""  # 三引号支持多行文本
print("单行文本:", text)  # 输出:Hello, Python!
print("多行文本:", multi_line)  # 输出多行内容# 2. 查:索引访问
print("第一个字符:", text[0])  # 输出:H
print("最后一个字符:", text[-1])  # 输出:!# 3. 不可修改:以下代码报错(TypeError)
# text[7] = 'p'  # 禁止直接修改字符# 4. 切片生成新字符串(原字符串不变)
new_text = text[:5] + " World!"  # 切片取前5个字符,拼接新内容
print("新字符串:", new_text)  # 输出:Hello World!# 5. 内置方法:文本处理
print("转大写:", text.upper())  # 输出:HELLO, PYTHON!
print("分割:", text.split(","))  # 输出:['Hello', ' Python!'](按逗号分割)
print("替换:", text.replace("Python", "Java"))  # 输出:Hello, Java!
适用场景
  • 所有文本处理场景(如用户输入、文件读写、接口返回的文本数据)。
  • 字符串格式化(如 f"Hello, {name}")。
  • 正则表达式匹配(需基于字符串操作)。

4. 集合(Set):无序无重复的数学集合

集合基于 “哈希表” 实现,核心价值是 “去重” 和 “数学运算”,适合处理 “无顺序、无重复” 的数据集。

核心特点
  • 无序性:元素无固定顺序,不支持索引(不能通过 set[0] 访问),每次打印顺序可能不同。
  • 无重复性:自动去重,添加重复元素会被忽略(无报错)。
  • 可变性:支持增(add)、删(remove/discard)元素,但元素必须是不可变类型(如整数、字符串、元组;列表、集合不能作为集合元素,因可变)。
  • 数学特性:支持交集(&)、并集(|)、差集(-)等数学运算,无需手动实现。
# 1. 定义集合(注意:空集合必须用set(),{}是空字典)
fruit_set = {"apple", "banana", "orange", "apple"}  # 重复元素"apple"会被自动去重
empty_set = set()  # 空集合(不能用{})
print("水果集合:", fruit_set)  # 输出:{'apple', 'banana', 'orange'}(顺序可能不同)# 2. 增:添加单个元素(重复添加无效果)
fruit_set.add("grape")
fruit_set.add("apple")  # 重复元素,无变化
print("添加后:", fruit_set)  # 输出:{'apple', 'banana', 'orange', 'grape'}# 3. 删:remove(元素不存在报错)、discard(元素不存在无报错)
fruit_set.remove("banana")  # 删除存在的元素
# fruit_set.remove("pear")  # 报错:KeyError
fruit_set.discard("pear")  # 无报错(元素不存在)
print("删除后:", fruit_set)  # 输出:{'apple', 'orange', 'grape'}# 4. 数学运算:交集、并集、差集
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
print("交集(共有的元素):", set1 & set2)  # 输出:{3, 4}
print("并集(所有元素):", set1 | set2)   # 输出:{1, 2, 3, 4, 5, 6}
print("差集(set1有、set2无):", set1 - set2)  # 输出:{1, 2}
适用场景
  • 数据去重(如处理重复的用户 ID、订单号)。
  • 数学集合运算(如找出两个列表的共同元素、差异元素)。
  • 判断元素是否存在(in 操作效率比列表高,列表是线性查找,集合是哈希查找,时间复杂度 O (1))。

5. 字典(Dictionary):键值映射的无序(3.7 + 有序)集合

字典是 Python 中最强大的容器之一,基于 “键值对(Key-Value)” 存储,核心价值是 “快速查询”(通过键找值,无需遍历)。

核心特点
  • 键值映射:每个元素是 key: value 对,通过唯一的 key 快速定位 value(时间复杂度 O (1))。
  • 键的特性key 必须是不可变类型(整数、字符串、元组),且唯一(重复添加相同 key 会覆盖旧值);value 可任意类型(包括列表、集合、字典)。
  • 有序性:Python 3.7 之前字典无序,3.7+ 后按插入顺序排列(官方特性,非临时)。
  • 可变性:支持增(dict[key] = value)、删(del dict[key])、改(dict[key] = new_value)、查(dict[key] 或 dict.get(key))。
# 1. 定义字典(键唯一,值可任意类型)
user_dict = {"name": "Alice","age": 25,"hobbies": ["reading", "running"],  # 值是列表(可变)"address": ("Beijing", "Haidian")   # 值是元组(不可变)
}
print("用户字典:", user_dict)  # 3.7+ 输出顺序与定义一致# 2. 查:两种方式([] 报错 vs get() 无报错)
print("姓名:", user_dict["name"])  # 输出:Alice(键存在)
# print("gender:", user_dict["gender"])  # 报错:KeyError(键不存在)
print("性别:", user_dict.get("gender", "Unknown"))  # 输出:Unknown(键不存在时返回默认值)# 3. 增/改:键存在则改,不存在则增
user_dict["age"] = 26  # 键存在,修改值
user_dict["gender"] = "Female"  # 键不存在,新增键值对
print("增改后:", user_dict)  # 输出包含 gender: Female# 4. 删:删除指定键
del user_dict["address"]
print("删除后:", user_dict)  # 输出不含 address 键# 5. 遍历:遍历键、值、键值对
print("遍历键:", end="")
for key in user_dict.keys():print(key, end=" ")  # 输出:name age hobbies genderprint("\n遍历值:", end="")
for value in user_dict.values():print(value, end=" ")  # 输出:Alice 26 ['reading', 'running'] Female
适用场景
  • 存储具有关联关系的数据(如用户信息:姓名→值、年龄→值)。
  • 快速查询场景(如根据 ID 查用户详情、根据商品编号查价格)。
  • 配置文件解析(如 JSON 数据在 Python 中常转为字典处理)。
  • 计数统计(如统计单词出现次数,键是单词,值是次数)。

三、关键区别总结(避坑指南)

  1. 可变性 vs 不可变性

    • 可变容器:列表、集合、字典(可修改元素,适合动态数据)。
    • 不可变容器:元组、字符串(不可修改元素,适合固定数据,可作为字典键)。
  2. 有序 vs 无序

    • 有序容器:列表、元组、字符串(支持索引访问,按插入顺序排列)。
    • 无序容器:集合(3.7- 字典也无序,3.7+ 字典有序)(不支持索引,适合去重 / 数学运算)。
  3. 元素唯一性

    • 唯一元素:集合(自动去重)、字典(键唯一)。
    • 可重复元素:列表、元组、字符串(允许重复,适合存储重复数据)。
  4. 索引方式

    • 整数索引:列表、元组、字符串(按位置访问)。
    • 键索引:字典(按键访问,效率高)。
    • 无索引:集合(需迭代访问)。
  5. 内存与性能

    • 内存占用:元组 < 列表(元组不可变,无需扩容空间);集合 / 字典因哈希表结构,内存占用较高,但查询效率高。
    • 查询效率:字典(键查询 O (1))> 集合(元素查询 O (1))> 列表 / 元组 / 字符串(索引查询 O (1),但非索引查询 O (n))。

四、容器选择决策树(快速选型)

遇到需求时,可按以下步骤选择容器:

  1. 是否需要键值映射?
    是 → 字典(如 “ID→用户信息”);否 → 继续。
  2. 是否需要去重或数学运算?
    是 → 集合(如 “找出重复的订单号”);否 → 继续。
  3. 数据是否需要修改?
    是 → 列表(如 “动态添加任务”);否 → 继续。
  4. 数据类型是文本?
    是 → 字符串(如 “处理用户输入的文本”);否 → 元组(如 “存储固定坐标 (x,y)”)。

        通过以上解析,可根据具体场景灵活选择容器 —— 例如:存储 “动态变化的用户列表” 用列表,存储 “固定的商品价格” 用字典,存储 “不允许修改的日期” 用元组,处理 “重复的日志数据” 用集合,处理 “用户输入的评论” 用字符串。


文章转载自:

http://OJZ7aUBq.ntwxt.cn
http://H5gW18e0.ntwxt.cn
http://MyCltuq4.ntwxt.cn
http://ksk2ITvP.ntwxt.cn
http://DMn4btUX.ntwxt.cn
http://9QZgRQL3.ntwxt.cn
http://tkK7zQz0.ntwxt.cn
http://20Pgm4sx.ntwxt.cn
http://ey8xFtdt.ntwxt.cn
http://4iStMlIy.ntwxt.cn
http://a1C5FETI.ntwxt.cn
http://l3tN1Ek3.ntwxt.cn
http://e4numO30.ntwxt.cn
http://Mjefa0WW.ntwxt.cn
http://Lxj1AauW.ntwxt.cn
http://HqeO4z0o.ntwxt.cn
http://yWesfLOw.ntwxt.cn
http://vnxcGGEW.ntwxt.cn
http://MU3VYoF6.ntwxt.cn
http://nEsVJOhr.ntwxt.cn
http://udUhuS9G.ntwxt.cn
http://HYF2iC27.ntwxt.cn
http://32C08OJU.ntwxt.cn
http://FGdea69r.ntwxt.cn
http://xBfzQMp2.ntwxt.cn
http://LEKxBkh6.ntwxt.cn
http://YufNmLs2.ntwxt.cn
http://pGXKiZBN.ntwxt.cn
http://obifFeCA.ntwxt.cn
http://2P6XN5x9.ntwxt.cn
http://www.dtcms.com/a/369305.html

相关文章:

  • 2021/07 JLPT听力原文 问题一 4番
  • 【Javascript】Capacitor 文件存储在 Windows 上的位置
  • LinuxC++项目开发日志——高并发内存池(2-整体框架设计)
  • DeepSeek辅助编写在windows中利用mingw编写用到内存映射文件和expat功能的C程序
  • 【前端教程】JavaScript 实现爱好选择与全选/全不选功能
  • 安全产业 出海行动 | 安贝斯受邀参加第六届非传统安全(杭州)国际论坛:靠近国际前沿 拓宽国际视野
  • Ruoyi-vue-plus-5.x第五篇Spring框架核心技术:5.1 Spring Boot自动配置
  • 一招快速识别你的电脑是机械硬盘还是固态硬盘
  • Centos7中部署Dify
  • 微服务架构下生鲜订单分布式事务解决方案指南
  • 电机试验平台:从实验到应用的创新突破
  • GitHub每日最火火火项目(9.5)
  • 十一、标准化和软件知识产权基础知识
  • B.50.10.07-分布式锁核心原理与电商应用
  • 语音识别系统的技术核心:从声音到文字的智能转换
  • WALLX全球大使圆桌论坛成功举办,13国代表共话未来,超千人共同参与
  • 本地化部署 DeepSeek
  • 开讲啦|MBSE公开课:第五集 MBSE中期设想(下)
  • Axure笔记
  • AMD三箭齐发:MI350已成AI加速器新王牌,256颗GPU的MI500“王炸”已预定2027
  • Docker Registry 实现原理、适用场景、常用操作及搭建详解
  • CAD:绘图功能
  • DeepSeek vs Anthropic:技术路线的正面冲突
  • spring cloud中使用openFeign时候get请求变post解决办法
  • 系统学习算法 专题十八 队列+宽搜
  • 【c++】c++第一课:命名空间
  • Graphpad 绘图(二):小鼠生存曲线绘制与数据记录分析详解
  • DNS基本功能搭建
  • C++Primerplus 编程练习 第十二章
  • 看见世界的另一种可能:Deepoc星眸(StarGaze)如何为视障生活带来曙光