算法题Python常用内置函数、方法、技巧汇总(其二:哈希表)

发布时间:2023年12月24日

哈希表相关操作

设置值的默认类型

使用内置模块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算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

文章来源:https://blog.csdn.net/weixin_48157259/article/details/135174483
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。