深入Python的字典dict和集合set

深入set和dict

1 dict的abc继承关系

dict的abc继承关系是指一组用于创建和操作映射对象的通用接口。这些接口包括MutableMappingMappingSizedIterableContainerGeneric。其中,MutableMapping继承自MappingMapping继承自SizedIterableContainer。这样,我们可以通过这些接口来定义和操作字典对象,而无需关心具体的实现细节。

另外,Generic是一个基类,它继承自TypeVar,用于指定类型变量的范围。因此,了解dict的abc继承关系对于深入理解Python中的字典类型以及相关操作非常重要。

from _collections_abc import MutableMapping,Mapping
a={}
print(isinstance(a,Mapping))

2 dict方法

以下是dict的一些常用方法:

  • clear(): 删除字典内所有元素
  • copy(): 复制字典,浅拷贝
  • fromkeys(seq, value=None): 以给定的序列为键,创建新的字典,值都设置为 value
  • get(key, default=None): 返回指定键的值,如果值不在字典中返回默认值
  • items(): 返回一个包含所有字典项的列表
  • keys(): 返回字典中所有键的列表
  • pop(key, default=None): 删除字典给定键 key 所对应的值,返回被删除的值。如果 key 不存在,返回默认值 default
  • popitem(): 随机返回并删除字典中的一对键和值
  • setdefault(key, default=None): 和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值
  • update(dict2): 把字典dict2的键/值对更新到dict里
  • values(): 返回字典中所有值的列表

3 dict的子类

Python中的dict有两个主要的子类:defaultdict和OrderedDict。

  • defaultdict: 它是一个字典类型,它定义了一个默认值,当访问一个不存在的键时,会返回一个默认值而不是引发KeyError异常。这个默认值可以通过一个工厂函数来指定,例如int、list等。
  • OrderedDict: 它是一个有序字典类型,它会记录元素添加的顺序,并保持这个顺序。因此,当你迭代它时,元素的顺序是可以保证的。

这些子类都继承了dict的所有功能,同时还提供了一些额外的功能。因此,在实际开发中,可以根据实际需求选择合适的子类来使用。

4 set和frozenset

set和frozenset都是Python中用于存储无序、不重复元素集合的数据类型。set是可变类型,可以进行添加、删除等操作。而frozenset是不可变类型,一旦创建就无法修改。

4.1 set

set的创建可以通过以下几种方式:

# 直接使用大括号
a = {1, 2, 3}
# 使用set()函数
b = set([1, 2, 3])

set支持添加元素、删除元素等操作。例如:

a = {1, 2, 3}
a.add(4)
a.remove(1)

set还支持集合操作,包括交集、并集、差集等操作。例如:

a = {1, 2, 3}
b = {2, 3, 4}
print(a & b)  # {2, 3}
print(a | b)  # {1, 2, 3, 4}
print(a - b)  # {1}

4.2 frozenset

frozenset的创建方式和set类似,但是一旦创建就无法修改。因此,它不支持添加元素、删除元素等操作,但是支持集合操作。例如:

a = frozenset([1, 2, 3])
b = frozenset([2, 3, 4])
print(a & b)  # frozenset({2, 3})
print(a | b)  # frozenset({1, 2, 3, 4})
print(a - b)  # frozenset({1})

由于frozenset是不可变类型,因此它可以作为字典的键或set的元素使用,而set则不行。例如:

a = {1, 2, 3}
b = frozense
t([2, 3, 4])
d = {a: 1, b: 2}  # TypeError: unhashable type: 'set'

4.3 set常见操作

  • add(elem): 添加元素
  • clear(): 删除集合内所有元素
  • copy(): 复制集合,浅拷贝
  • difference(set): 返回一个新集合,包含在原始集合中但不在指定集合中的元素
  • difference_update(set): 从原始集合中删除指定集合中的元素
  • discard(elem): 删除集合中的元素
  • intersection(set): 返回一个新集合,包含原始集合和指定集合中都有的元素
  • intersection_update(set): 从原始集合中删除不在指定集合中的元素
  • isdisjoint(set): 判断集合是否无交集
  • issubset(set): 判断集合是否为指定集合的子集
  • issuperset(set): 判断集合是否为指定集合的超集
  • pop(): 随机删除集合中的一个元素,并返回该元素
  • remove(elem): 删除集合中的元素,如果元素不存在则引发KeyError异常
  • symmetric_difference(set): 返回一个新集合,包含原始集合和指定集合中只出现过一次的元素
  • symmetric_difference_update(set): 把原始集合中只出现过一次的元素和指定集合中只出现过一次的元素更新到原始集合中
  • union(set): 返回一个新集合,包含原始集合和指定集合中的所有元素
  • update(set): 把指定集合中的元素添加到原始集合中

5 dict和set的实现原理

5.1 dict实现原理

Python中的dict实现原理是基于哈希表的。哈希表是一种根据键(key)直接访问值(value)的数据结构。它通过把键映射到数组的一个位置来访问值。

Python的哈希表是一个稀疏数组,每个元素是一个指向一个Entry对象的指针。Entry对象包含key、value和指向下一个Entry对象的指针。这样,哈希表就可以解决键冲突的问题。当两个键映射到同一个位置时,它们会形成一个链表,每个链表节点都是一个Entry对象。

Python的哈希表大小是动态调整的。当哈希表元素数量达到一定阈值时,Python会自动增加哈希表大小,以保证哈希表的负载因子不超过一个预设的值。同时,Python也支持手动调整哈希表大小,通过调用dict对象的resize()方法来实现。

哈希表的实现使得Python的dict类型可以实现平均 O ( 1 ) O(1) O(1)的查找、插入和删除操作,因此在Python中被广泛使用。

5.2 set实现原理

Python中的set实现原理和dict类似,也是基于哈希表的。set实际上是一个只有键没有值的字典,因此它的实现与dict非常相似。具体来说,set是通过dict实现的,set中的元素实际上就是dict中的键。

set的操作和dict类似,包括添加元素、删除元素、判断元素是否存在等操作。由于set的实现也是基于哈希表的,因此set的时间复杂度也是平均 O ( 1 ) O(1) O(1)的。

需要注意的是,Python中的set和数学中的集合有一些差别。Python中的set是一个无序的、不重复的元素集合,而数学中的集合没有这些限制。此外,Python中的set支持集合操作,包括交集、并集、差集等操作,而数学中的集合也支持这些操作。因此,在使用Python中的set时,需要注意这些差别。

本文介绍了Python中的字典和集合类型。首先,介绍了字典类型的ABC继承关系和常用方法,以及Python中的两个主要的字典子类:defaultdict和OrderedDict。然后,介绍了集合类型的常用操作和集合实现原理。最后,总结了本文的内容。

总之,了解字典和集合类型的使用和实现原理对于Python编程和算法设计都非常重要。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦滋堡的摸鱼芝士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值