Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比

以下是 Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比分析,结合了核心特性、操作方式和应用场景的深度总结:


一、核心特性对比

特性列表(List)元组(Tuple)集合(Set)字典(Dict)
定义语法[]list()()tuple(){}set(){}dict()
可变性✔️ 可变(增删改)❌ 不可变✔️ 可变(元素不可变)✔️ 可变(键不可变,值可变)
有序性✔️ 按插入顺序存储✔️ 按插入顺序存储❌ 无序✔️ 有序(Python 3.7+ 保留插入顺序)
元素唯一性❌ 允许重复❌ 允许重复✔️ 自动去重✔️ 键唯一,值可重复
内存效率较低(动态分配)较高(固定分配)中等(哈希表存储)较高(哈希表存储键值对)
典型用途动态数据集合不可变数据存储去重、集合运算键值对映射

二、操作方法与功能

1. 列表(List)
  • 定义方式
    • 标准语法:用方括号 [] 包裹元素,元素间用逗号分隔
      fruits = ["apple", "banana", "orange"]
      empty_list = []  # 空列表
      
    • 动态创建:通过 list() 函数转换其他可迭代对象
      numbers = list(range(5))  # [0, 1, 2, 3, 4]
      
  • 增删改查
    nums = [1, 2, 3]
    nums.append(4)       # 末尾添加元素 → [1,2,3,4]
    nums.insert(1, 10)  # 插入元素 → [1,10,2,3,4]
    nums.pop()           # 删除末尾元素 → [1,10,2,3]
    
    • 核心特性
      • 可变性:支持增删改操作(如 append()insert()pop()
      • 有序性:元素按插入顺序存储,支持索引和切片
      • 元素类型:可包含任意数据类型(整数、字符串、列表等)
    • 适用场景:动态数据集合(如用户输入记录、日志分析)
    • 高级操作:切片、列表推导式(如 [x**2 for x in range(5)]
2. 元组(Tuple)
  • 定义方式
    • 标准语法:用圆括号 () 包裹元素,元素间用逗号分隔
      coordinates = (30, 50)
      single_element = (42,)  # 单元素元组必须加逗号
      
    • 隐式定义:仅用逗号分隔元素(无需括号)
      point = 10, 20  # 自动转为元组
      
    • 转换生成:通过 tuple() 函数转换其他可迭代对象
      letters = tuple("Hello")  # ('H', 'e', 'l', 'l', 'o')
      
  • 不可变特性
    point = (3, 5)
    x, y = point        # 解包 → x=3, y=5
    
  • 核心特性
    • 不可变性:创建后无法修改元素(尝试修改会报错)
    • 有序性:元素顺序固定,支持索引和切片
    • 内存效率:因不可变性,创建和访问速度优于列表
  • 适用场景:存储固定数据(如配置参数、数据库查询结果)
  • 特殊操作:命名元组(namedtuple)增强可读性
3. 集合(Set)
  • 定义方式

    • 标准语法:用花括号 {} 包裹元素,元素间用逗号分隔
      unique_numbers = {1, 2, 2, 3}  # 自动去重 → {1, 2, 3}
      
    • 动态创建:通过 set() 函数转换其他可迭代对象
      letters_set = set("abracadabra")  # {'a', 'b', 'r', 'c', 'd'}
      empty_set = set()  # 空集合(不可用 {},否则为字典)
      
  • 去重与运算

    a = {1, 2, 3}
    b = {3, 4, 5}
    print(a & b)        # 交集 → {3}
    
    • 核心特性
      • 唯一性:自动去除重复元素
      • 无序性:元素无固定顺序,不支持索引
      • 集合运算:支持交(&)、并(|)、差(-)等数学运算
    • 适用场景:数据去重、快速成员检测(如唯一 IP 统计)
    • 高级操作:集合推导式(如 {x**2 for x in range(5)}
4. 字典(Dict)
  • 定义方式
    • 标准语法:用花括号 {} 包裹键值对,格式为 键: 值
      student = {"name": "小明", "age": 18}
      empty_dict = {}  # 空字典
      
    • 动态创建:通过 dict() 函数转换键值对列表或元组
      key_values = [("a", 1), ("b", 2)]
      my_dict = dict(key_values)  # {'a':1, 'b':2}
      
    • 字典推导式:快速生成键值对
      squares = {x: x**2 for x in range(5)}  # {0:0, 1:1, ..., 4:16}
      
  • 键值对操作
    student = {"name": "小明", "age": 18}
    student["score"] = 90          # 添加键值对
    age = student.get("age", 20)   # 安全获取值 → 18,如果没有取到值,就给age赋值20,但dict不变
    
    • 核心特性
      • 键唯一性:键必须为不可变类型(如字符串、元组),值可重复
      • 有序性(Python 3.7+):保留插入顺序
      • 快速查找:基于哈希表实现,键的查询时间复杂度为 O(1)
    • 适用场景:映射关系存储(如缓存系统、配置信息)
    • 高级操作:字典推导式(如 {x: x**2 for x in range(5)})、嵌套字典

三、性能与优化建议

  1. 查询速度

    • 集合和字典基于哈希表实现,in 操作时间复杂度为 O(1),远快于列表的 O(n)。
    • 示例
      # 列表 vs 集合的成员检测性能
      list_time = timeit.timeit('99999 in my_list', setup='my_list = list(range(100000))', number=1000)
      set_time = timeit.timeit('99999 in my_set', setup='my_set = set(range(100000))', number=1000)
      
  2. 内存占用

    • 元组因不可变性内存占用最低,字典因存储哈希表结构占用较高。
  3. 线程安全

    • 元组的不可变性天然支持多线程安全,适合共享数据场景。

四、选型决策树

  1. 需要动态增删?列表(如待办事项管理)。
  2. 需要数据不可变?元组(如函数多返回值)。
  3. 需要去重或集合运算?集合(如用户兴趣标签分析)。
  4. 需要键值映射?字典(如缓存系统、配置存储)。

五、实际应用案例

  1. 元组作为字典键

    coordinates = {(0, 0): "原点", (1, 1): "第一象限"}  # 元组不可变,可作为键
    
  2. 集合快速去重

    logs = ["192.168.1.1", "10.0.0.1", "192.168.1.1"]
    unique_ips = {log.split()[0] for log in logs}  # 推导式去重
    
  3. 字典合并数据

    dict1 = {'a': 1}
    dict2 = {'b': 2}
    merged = dict1 | dict2  # Python 3.9+ 合并 → {'a':1, 'b':2}
    

六、总结

  • 列表:灵活的动态数据容器,适合频繁修改的场景。
  • 元组:轻量级不可变结构,适合固定数据和线程安全需求。
  • 集合:高效去重与数学运算工具,适合唯一性处理。
  • 字典:键值映射的哈希表实现,适合快速查询和关联数据存储。

通过合理选择数据结构,可显著提升代码效率和可维护性。如需进一步了解具体操作,可参考各数据结构的官方文档或示例代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示(tooltip)是一个常见的 UI 组件,用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本,所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

软件工程面试题(十五)

1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker环境

背景 本人使用 Ubuntu Server 22.04 服务器&#xff0c;所以没有图形界面&#xff0c;而 QNX Software Center 需要图形界面。为了保证服务器环境的整理&#xff0c;计划使用Docker部署QNX Software Center 一瓶安装图形界面。本方既是实现方案的记录。 资源 Dockerfile&…

C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

粘包问题解决方案

粘包问题详解&#xff1a;TCP协议中的常见问题及Go语言解决方案 一、什么是粘包问题&#xff1f; 粘包问题是指在TCP通信中&#xff0c;发送方发送的多个独立消息在接收方被合并成一个消息接收的现象。换句话说&#xff0c;发送方发送的多条消息在接收方被“粘”在一起&#…

vue:突然发现onok无法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果当前商品存在于商品活动库&#xff0c;则在商品活动库的状态会下架",onOk: function () {that.submitForm();}}); 突然发现 this.$confirm无法进入onok 最终发现是主题冲突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表实现中&#xff0c;index hash & dict->ht[0].sizemask 是计算键值对应存储位置的核心操作。这个操作看起来简单&#xff0c;但背后涉及哈希表的内存布局和性能优化策略。我们通过以下步骤逐步解析其原理&#xff1a; 一、哈希表的设计目标 快速定位…

Ruby 命令行选项

Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长…

Java 数据库连接池

HikariCP 老外开源的。 Spring Boot 2 之后默认选择的连接池。 号称性能最快的数据库连接池。 为什么性能好呢&#xff1f; ● 字节码级别的优化-尽量的利用 JIT 的内联手段 ● 字节码级别的优化-利用更容易被 JVM 优化的指令 ● 代码级别的优化-利用改造后的 FastList 代替…

Spring Boot中@Valid 与 @Validated 注解的详解

Spring Boot中Valid 与 Validated 注解的详解 引言Valid注解功能介绍使用场景代码样例 Validated注解功能介绍使用场景代码样例 Valid与Validated的区别结论 引言 在Spring Boot应用中&#xff0c;参数校验是确保数据完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能扩展说明&#xff1a; 图类封装&#xff1a;将图数据结构封装为类&#xff0c;提高代码复用性 最短路径查找&#xff1a;基于BFS实现未加权图的最短路径查找 路径重构&#xff1a;通过parent数组回溯构建完整路径 异常处理&#xff1a;当路径不存在时返回空向量 复杂度分析…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

CSS学习笔记6——网页布局

目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

sqlalchemy:将mysql切换到OpenGauss

说明 之前python的项目使用的mysql&#xff0c;近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;测试下来发现不用改代码&#xff0c;只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在&#xff1a;https:…

uniapp 获取dom信息(封装获取元素信息工具函数)

在uniapp开发中&#xff0c;需要获取到dom的信息&#xff0c;需要用到uniapp的指定方式 uni.createSelectorQuery()&#xff0c;但是每次需要用到的时候都需要很长一段的繁琐代码&#xff0c;本篇文章将呈现获取dom信息方法封装&#xff0c;话不多说&#xff0c;上菜&#xff1…

Linux之数据链路层

Linux之数据链路层 一.以太网1.1以太网帧格式1.2MAC地址1.3MTU 二.ARP协议2.1ARP协议工作流程2.2ARP协议格式 三.NAT技术四.代理服务4.1正向代理4.2反向代理 五.四大层的学习总结 一.以太网 在我们学习完了网络层后我们接下来就要进入数据链路层的学习了&#xff0c;在学习完网…

MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数&#xff08;如下&#xff09;&#xff1a; 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

全新版租赁商城小程序源码系统 源码开源支持二开+图文搭建教程

在互联网商业的浪潮中&#xff0c;租赁业务凭借其独特的优势&#xff0c;正逐渐成为市场的新宠。对于开发者而言&#xff0c;快速搭建一个功能完备的租赁商城小程序&#xff0c;不仅能满足市场需求&#xff0c;还能为自己的业务拓展带来新的机遇。分享一款全新版租赁商城小程序…

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…