哈希表相关操作
1. 设置值的默认类型
使用内置模块collections中的defaultdict(func),能够将哈希表的值value的默认类型设置为func。譬如要设置哈希表中value的默认类型为list,其语法如下:
from collections import defaultdict
dic = defaultdict(list)
# dic[0]此时即为一个空列表,可以使用所有的列表操作
dic[0].append(1)
dic[0].extend([2, 3])
- 如果设置了value的默认类型为list,那么访问key对应的value默认得到一个空列表[]
- 如果设置了value的默认类型为int,那么访问key对应的value默认得到数字0
- 如果设置了value的默认类型为str,那么访问key对应的value默认得到空字符串""
除了设置默认类型,defaultdict()还可以结合lambda匿名函数,设置更加丰富的默认值。譬如想设置value的默认值为1,其语法如下:
from collections import defaultdict
dic = defaultdict(lambda: 1)
print(dic[0]) # 会输出1
dic = defaultdict(lambda: "aabbcc")
print(dic[0]) # 会输出"aabbcc"
2. 计数器
在内置模块collections中引入Counter(),可以直接统计字符串、列表等可迭代对象的元素频率。
from collections import Counter
lst = [1, 1, 2, 3, 3]
cnt = Counter(lst)
注意,Counter()的value默认是0,如果某一个键key并不位于cnt中,也可以访问或添加。如以下语句是合法的:
from collections import Counter
lst = [1, 1, 2, 3, 3]
cnt = Counter()
# 更新lst中各个数字num的频率
for num in lst:
cnt[num] += 1
# 访问数字1对应的频率
print(cnt[1])
如果使用dict(),那么上述代码逻辑应该修改为
lst = [1, 1, 2, 3, 3]
cnt = dict()
# 更新lst中各个数字num的频率
for num in lst:
# 需要判断num是否已经作为key存入cnt中
# 如果不存在,需要新建key-value对
# 设置cnt[num]为1,表示num出现了1次
if num not in cnt:
cnt[num] = 1
# 如果存在,才可以直接更新cnt[num]
else:
cnt[num] += 1
# 访问数字1对应的频率
print(cnt[1])
显然,如果直接使用dict(),并不是不能够完成计数的功能,只是在代码逻辑上需要多加一个判断,较为冗长。如果没有加上述判断,直接执行以下代码,
lst = [1, 1, 2, 3, 3]
cnt = dict()
# 更新lst中各个数字num的频率
for num in lst:
cnt[num] += 1
# 访问数字1对应的频率
print(cnt[1])
则会出现键错误的报错
KeyError: 1
表示1这个key不位于dict()中。
换句话说,直接使用Counter()就可以不用像dict()那样繁琐地判断key是否位于dict()中。所以在需要进行元素频率记录的时候,直接使用Counter()会比使用dict()更加方便。
对于defaultdict()来说,也是同理的。在已知所储存的value的类型时,用defaultdict()可以避免频繁的判断。
3. 获得键、值或者键值对
哈希表的keys(),values()以及items()方法分别可以获得键、值或者键值对的一个可迭代对象。
dic = {0: 1, 2: 3, 4: 5}
# 遍历key方法1
# 分行输出:0 2 4
for k in dic:
print(k)
# 遍历key方法2
# 分行输出:0 2 4
for k in dic.keys():
print(k)
# 获得哈希表中所有键key组成的一个列表
# keys = [0, 2, 4]
keys = list(dic.keys())
# 遍历values
# 分行输出:1 3 5
for v in dic.values():
print(v)
# 获得哈希表中所有值value组成的一个列表
# values = [1, 3, 5]
values = list(dic.values())
# 遍历key和values
# 分行输出:0 1 2 3 4 5
for k, v in dic.items():
print(k, v)
# 获得哈希表中所有键值对(key, value)组成的一个二元列表
# pairs = [(0, 1), (2, 3), (4, 5)]
pairs = list(dic.items())
342



被折叠的 条评论
为什么被折叠?



