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

发布于:2025-05-23 ⋅ 阅读:(17) ⋅ 点赞:(0)

在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
## 结果 False

d = {'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 sys

d = {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'}

八、总结

选择依据

优先使用字典

优先使用集合

是否需要关联数据

✅ 是(键值对)

❌ 否(仅元素)

是否需要频繁检测存在性

✅ 检查键存在

✅ 直接检测元素更快

是否需要去重

❌ 不适用(键本已唯一)

✅ 是

是否需要集合运算

❌ 需手动实现

✅ 原生支持操作符

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


网站公告

今日签到

点亮在社区的每一天
去签到