使用内置模块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"
在内置模块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()
可以避免频繁的判断。
哈希表的keys()
,values()
以及items()
方法分别可以获得键、值或者键值对的一个可迭代对象。
dic = {0: 1, 2: 3, 4: 5}
# 遍历key方法1
for k in dic:
print(k)
# 遍历key方法2
for k in dic.keys():
print(k)
# 获得哈希表中所有键key组成的一个列表
keys = list(dic.keys())
# 遍历values
for v in dic.values():
print(v)
# 获得哈希表中所有值value组成的一个列表
values = list(dic.values())
# 遍历key和values
for k, v in dic.items():
print(k, v)
# 获得哈希表中所有键值对(key, value)组成的一个二元列表
pairs = list(dic.items())
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
绿色聊天软件戳 od1336
了解更多