文章目录
- 哈希表相关操作
- 设置值的默认类型
- 计数器
- 获得键、值或者键值对
- 华为OD算法/大厂面试高频题算法练习冲刺训练
哈希表相关操作
设置值的默认类型
使用内置模块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]) # 会输出1dic = defaultdict(lambda: "aabbcc")
print(dic[0]) # 会输出"aabbcc"
计数器
在内置模块collections中引入Counter(),可以直接统计字符串、列表等可迭代对象的元素频率。
from collections import Counterlst = [1, 1, 2, 3, 3]
cnt = Counter(lst)
注意,Counter()的value默认是0,如果某一个键key并不位于cnt中,也可以访问或添加。如以下语句是合法的:
from collections import Counterlst = [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算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336了解更多