深入set和dict
1 dict的abc继承关系
dict的abc继承关系是指一组用于创建和操作映射对象的通用接口。这些接口包括MutableMapping
、Mapping
、Sized
、Iterable
、Container
和Generic
。其中,MutableMapping
继承自Mapping
,Mapping
继承自Sized
、Iterable
和Container
。这样,我们可以通过这些接口来定义和操作字典对象,而无需关心具体的实现细节。
另外,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)
: 以给定的序列为键,创建新的字典,值都设置为 valueget(key, default=None)
: 返回指定键的值,如果值不在字典中返回默认值items()
: 返回一个包含所有字典项的列表keys()
: 返回字典中所有键的列表pop(key, default=None)
: 删除字典给定键 key 所对应的值,返回被删除的值。如果 key 不存在,返回默认值 defaultpopitem()
: 随机返回并删除字典中的一对键和值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编程和算法设计都非常重要。