2026-10-30 09:21:21
Python中的词典(dict)和集合(set)是两种重要的数据结构,它们都依赖于哈希表实现高效的数据存储和检索。以下是对这两种数据结构的详细解析:
1. Hashable的定义一个对象要成为哈希表中的键,必须满足以下条件:
示例:
Python的collections.abc模块提供了Mapping和MutableMapping抽象基类,作为字典和其他映射类型的接口。
>>> import collections.abc as abc>>> my_dict = {}>>> isinstance(my_dict, abc.Mapping)True3. dict类字典是键值对的集合,其中键必须是可哈希的。字典支持多种构建方式:
>>> a = dict(one=1, two=2, three=3)>>> b = {'one': 1, 'two': 2, 'three': 3}>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))>>> d = dict([('one', 1), ('three', 3), ('two', 2)])>>> e = dict({'three': 3, 'one': 1, 'two': 2})>>> print(a == b == c == d == e)True字典推导式(dictcomps)字典推导式提供了一种简洁的构建字典的方式:
>>> data = [(1, "one"), (2, "two"), (11, "eleven"), (5, "five"), (8, "eight")]>>> data_dict = {i: j for i, j in data if i > 3}>>> data_dict{11: 'eleven', 5: 'five', 8: 'eight'}处理缺失键的方法setdefault方法:若键存在,返回其值;否则,插入键并设置默认值。
>>> d = {'1': [1, 2, 3], '3': [1]}>>> d.setdefault('2', []).append(2)>>> d{'1': [1, 2, 3], '3': [1], '2': [2]}defaultdict:自动处理缺失键,为其设置默认值。
>>> import collections>>> d = collections.defaultdict(list, {'1': [1, 2, 3], '3': [1]})>>> d['2'].append(2)>>> ddefaultdict(<class 'list'>, {'1': [1, 2, 3], '3': [1], '2': [2]})OrderedDict:保持键的插入顺序。
ChainMap:管理多个映射的视图。
Counter:用于计数可哈希对象。
>>> a = collections.Counter('addjjjddd')>>> aCounter({'d': 5, 'j': 3, 'a': 1})>>> a.update('dddaae')>>> aCounter({'d': 8, 'a': 3, 'j': 3, 'e': 1})>>> a.most_common(1)[('d', 8)]UserDict:便于自定义字典类。
>>> class userdict(collections.UserDict):... def __setitem__(self, key, item):... self.data[str(key)] = item + '-add'>>> a = userdict({1: '1', 2: '2'})>>> a{'1': '1-add', '2': '2-add'}MappingProxyType:创建不可变映射。
集合是无序不重复元素的集合,分为可变集合(set)和不可变集合(frozenset)。集合支持多种集合运算:
>>> a = {'a', 'b', 'c'}>>> d = {'d', 'c'}>>> a & d # 交集{'c'}>>> a | d # 并集{'b', 'c', 'a', 'd'}>>> a.pop() # 随机移除并返回元素'b'>>> {'a'} <= a # 子集检查True5. dict、set与哈希表字典和集合通过哈希表实现高效查找。查找过程如下:
哈希表需保持稀疏以减少冲突,确保高效性能。
总结字典和集合是Python中强大的数据结构,利用哈希表实现快速查找和操作。理解其底层机制有助于编写高效代码,并根据需求选择合适的变体或处理方法。