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

深入对比分析 Python 中字典和集合 异同

在Python中,字典(dict)和集合(set是两种常用的内置数据结构,虽然它们都基于哈希表实现,但在设计目的、操作方法和使用场景上有显著差异。以下是对它们的深入对比分析:

一、核心概念

  1. 字典 (dict)

    • 键值对存储:字典是一系列由键和值配对组成的元素的集合。
    • 在python3.7+,字典被确定为有序。键唯一且不可变(如字符串、数字、元组等)。
    • 用途:适用于通过键快速查找、更新或管理关联数据(如配置文件、缓存等)。
  2. 集合 (set)

    • 唯一元素存储:集合是一系列无序的、唯一的元素组合。
    • 集合无序,且元素本身必须是不可变类型。
    • 用途:去重、成员检测、集合运算(如交集、并集等)。

二、增删改查操作对比

1、创建

  • 字典和集合,无论是键还是值,都可以是混合类型。
## 字典创建
d1 = {'name': 'jason', 'age': 20, 'gender': 'male'}
d2 = dict({'name': 'jason', 'age': 20, 'gender': 'male'})
d3 = dict([('name', 'jason'), ('age', 20), ('gender', 'male')])
d4 = dict(name='jason', age=20, gender='male') d1 == d2 == d3 ==d4
## 结果 True## 集合创建
s1 = {1, 2, 3}
s2 = set([1, 2, 3])
s1 == s2
## 结果True## 混合类型集合
s = {1, 'hello', 5.0}

2、元素访问

(1)字典访问可以直接索引键,如果不存在,则抛出异常。

(2)字典还使用  get(key, default) 函数来进行索引。如果键不存在,调用 get() 函数可以返回 一个默认值。

 d = {'name': 'jason', 'age': 20}print(d['name'])## 结果 'jason'print(d['location'])
## 结果 Traceback (most recent call last):
##  File "<stdin>", line 1, in <module>
##  KeyError: 'location'd.get('location', 'null')
## 结果 'null'

(3)集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一

 (4)想要判断一个元素在不在字典或集合内,我们可以用 value in dict/set 来判断。

s = {1, 2, 3}
1 in s
## 结果 True
10 in s
## 结果 Falsed = {'name': 'jason', 'age': 20}
'name' in d
## 结果 True
'location' in d
## 结果 False

3、增删改操作

d = {'name': 'jason', 'age': 20}
d['gender'] = 'male' # 增加元素对'gender': 'male'
d['dob'] = '1999-02-01' # 增加元素对'dob': '1999-02-01'
print(d)
## 结果 {'name': 'jason', 'age': 20, 'gender': 'male', 'dob': '1999-02-01'}d['dob'] = '1998-01-01' # 更新键'dob'对应的值
d.pop('dob') # 删除键为'dob'的元素对
## 结果 '1998-01-01'
print(d)
## 结果 {'name': 'jason', 'age': 20, 'gender': 'male'}s = {1, 2, 3}
s.add(4) # 增加元素 4 到集合
print(s)
## 结果 {1, 2, 3, 4}
s.remove(4) # 从集合中删除元素 4
print(s)
## 结果 {1, 2, 3}

三、共同点

  1. 基于哈希表
    • 两者均通过哈希表实现,提供平均 O(1) 时间复杂度的查找、插入和删除操作。
  2. 无序性
    • Python 3.7+ 中字典保留插入顺序,但集合始终无序。
  3. 元素唯一性
    • 字典的键和集合的元素均不允许重复。

四、差异对比

特性

字典 (dict)

集合 (set)

存储内容

键值对 (key: value)

单个元素

初始化语法

d = {"a": 1, "b": 2}

s = {1, 2, 3}

空对象创建

d = {}dict()

s = set()(不可用 {},会创建字典)

元素访问

通过键:d["a"]

不可直接索引,需遍历或检测存在性

常用操作

增删改查键值对、.keys().values()

集合运算(&)

内存占用

较高(需存储键和值)

较低(仅存储元素)

哈希冲突处理

相同哈希值通过开放寻址法解决

类似字典,但未存储值,结构更简单

五、性能对比

1.查找元素

  • 字典和集合的查找均接近 O(1),但集合的哈希计算可能略快(无需处理值)。
# 示例:检测元素存在性
key in my_dict    # 检查键是否存在
element in my_set # 检查元素是否存在

2.插入与删除

  • 集合的插入(.add())和删除(.remove())略微快于字典的同级操作(需额外处理值)。

3.内存效率

  • 存储相同元素时,集合更省内存(仅存储键,无值),例如:
import sysd = {i: None for i in range(1000)}
s = set(range(1000))
sys.getsizeof(d) # 约 29504 bytes
sys.getsizeof(s) # 约 32968 bytes (注意:Python版本不同结果可能不同)

六、使用场景

1. 字典适用场景

  • 需要关联数据的场景(如数据库记录、JSON数据处理)。
  • 通过键快速查找、更新或删除值(如缓存系统)。
  • 统计频率(如 collections.defaultdict 统计词频)。

2. 集合适用场景

  • 去重(如从列表中快速删除重复项)。
  • 集合运算(如查找共同好友、差异分析)。
  • 高效检测元素存在性(如屏蔽词过滤)。

七、高级特性

1. 字典视图对象

  • dict.keys(), dict.values(), dict.items() 返回动态视图,与字典同步更新。
d = {"a": 1, "b": 2}
keys = d.keys()
d["c"] = 3
print(keys) # 输出 dict_keys(['a', 'b', 'c'])

2. 集合运算操作符

  • 并集 (|)、交集 (&)、差集 (-)、对称差集 (^)。
s1 = {1, 2, 3}
s2 = {3, 4, 5}
print(s1 - s2) # 输出 {1, 2}

 3. 字典推导式 vs 集合推导式

  • 语法相似,但生成对象不同:
# 字典推导式
{k: v*2 for k, v in [("a", 1), ("b", 2)]} 
# 结果  {'a': 2, 'b': 4}# 集合推导式
{x for x in "hello"} 
# 结果 {'h', 'e', 'l', 'o'}

八、总结

选择依据

优先使用字典

优先使用集合

是否需要关联数据

✅ 是(键值对)

❌ 否(仅元素)

是否需要频繁检测存在性

✅ 检查键存在

✅ 直接检测元素更快

是否需要去重

❌ 不适用(键本已唯一)

✅ 是

是否需要集合运算

❌ 需手动实现

✅ 原生支持操作符

通过理解两者的底层机制和设计目的,可以在实际编码中更高效地选择合适的数据结构。

http://www.xdnf.cn/news/8159.html

相关文章:

  • 高等数学-曲线积分与曲面积分
  • SpringBoot 对象转换 MapStruct
  • 《函数指针数组:创建与使用指南》
  • 【T2I】Controllable Generation with Text-to-ImageDiffusion Models: A Survey
  • 嵌入式学习笔记 D25 :标准i/o操作(2)、文件i/o
  • 2025年5月通信科技领域周报(5.12-5.18):6G太赫兹技术商用突破 空天地一体化网络进入规模部署期
  • Windows解除占用(解除文件占用、解除目录占用)查看文件进程(查看父进程、查看子进程、查看父子进程)占用文件占用、占用目录占用
  • 纳斯达克与标普500的技术博弈:解析美股交易系统的低延迟与高安全解决方案
  • 基于SpringBoot的动漫交流与推荐平台-036
  • 【学习笔记】计算机操作系统(五)—— 虚拟存储器
  • 数据库5——审计及触发器
  • 模拟地和数字地的连接方式
  • Java中的大根堆与小根堆
  • 无人机避障——深蓝学院浙大Ego-Planner规划部分
  • 工具看点 | 澳鹏多模态标注工具:构建AI认知的语义桥梁
  • 第四十五节:目标检测与跟踪-Meanshift/Camshift 算法
  • MCP Server Resource 开发学习文档
  • 记一次奇葩的错误,uniapp @tap点击失效
  • Nockchain项目部署教程
  • 从连接中枢到终端接入——解析工业无线AP与客户端的协同之道
  • 安装部署配置jenkins
  • Nginx 1.25.4交叉编译问题:编译器路径与aclocal.m4错误解决方案
  • wifi 如果检查失败,UI 就会出现延迟或缺失打勾的现象。
  • linux中部署jdk,开机自启动jdk以及linux中java开机自启某个jar包文件
  • 算法第26天 | 贪心算法、455.分发饼干、376. 摆动序列、 53. 最大子序和
  • 如何在Java中进行PDF合并
  • 软考 系统架构设计师系列知识点之杂项集萃(69)
  • Linux Shell编程(五)
  • 【鸿蒙开发】Hi3861学习笔记-超声波测距
  • HTB-Titanic