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

文章目录

  • 哈希表相关操作
    • 设置值的默认类型
    • 计数器
    • 获得键、值或者键值对
  • 华为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了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异常处理和单元测试python

一、实验题目 异常处理和单元测试 二、实验目的 了解异常的基本概念和常用异常类。掌握异常处理的格式、处理方法。掌握断言语句的作用和使用方法。了解单元测试的基本概念和作用。掌握在Python中使用测试模块进行单元测试的方法和步骤。 三、实验内容 编程实现如下功能&a…

HTTP小记1

目录 post不一定比get安全 HTTP与HTTPS区别 HTTP/1.1的优点 长连接的好处 HTTP/1.1性能 post不一定比get安全 post用bady传输数据,get用url传输数据,但这并不能说get就是比post安全的。 在浏览器地址栏可以看到使用get请求明文传输的数据&#xff…

API 接口怎样设计才安全?

设计安全的API接口是确保应用程序和数据安全的重要方面之一。下面是一些设计安全的API接口的常见实践: 1. 身份验证和授权: 使用适当的身份验证机制,如OAuth、JWT或基本身份验证,以确保只有经过身份验证的用户可以访问API。实施…

C++11并发与多线程

C11并发与多线程 1. 线程是进程中的实际运作单位 并发:两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务 进程:一个可执行程序运行起来了,就叫创建了…

1、TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?

文章目录 1、TCP 和 UDP 区别?2、TCP/IP 协议涉及哪几层架构?3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手? 1、TCP 和 UDP 区别? (1)TCP 基于连接,UDP 基于无连接。 &…

蓝桥杯2019年11月青少组Python程序设计省赛真题

1、试编写一个程序,输入一个整数,输出它的各个数位之和。 2、试编写一个程序,输入一个带有小数的数字,输出它的各个数位之和。 3、小兰要为1-2020住户制作门牌号,例如制作1107号门牌,需要制作2块1字符,一块0"字符一块7"字符,求制作1-2020需要多少块2. 4、编程画…

【量化金融】证券投资学

韭菜的自我修养 第一章: 基本框架和概念1.1 大盘底部形成的技术条件1.2 牛市与熊市1.3 交易系统1.3.1 树懒型交易系统1.3.2 止损止损的4个技术 第二章:证券家族4兄弟2.1 债券(1)债券,是伟大的创新(2&#x…

【零基础入门Python】Python参数

✍面向读者:所有人 ✍所属专栏:零基础入门Pythonhttps://blog.csdn.net/arthas777/category_12455877.html 目录 print()中的Python结束参数 print()中的Python|sep参数 Python的格式转换规则 使用格式…

种系进化树分析和构建工具R工具包S.phyloMaker的介绍和详细使用方法

S.PhyloMaker介绍 先看文章:updated megaphylogeny of plants, a tool for generating plant phylogenies and an analysis of phylogenetic community structure | Journal of Plant Ecology | Oxford Academic 再看仓库:GitHub - jinyizju/S.PhyloMa…

【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)

在上一篇文章中我们学习了散列表的相关知识点及进行了选择题、编程题的练习,这篇文章中我们将进行编程题的练习,带领读者以练代学、更好地掌握知识点。 目录 R7-1 QQ帐户的申请与登陆R7-2 词频统计R7-3 新浪微博热门话题R7-4 航空公司VIP客户查询R7-1 字…

九大GRASP类和设计模式

面向对象设计原则是一组指导软件设计的原则,其中GRASP(General Responsibility Assignment Software Patterns)是其中的一部分。这些原则帮助设计者确定类应该负责执行哪些职责,以及如何分配这些职责。在下面的文档中,…

leetcode 30. 串联所有单词的子串

题目链接:leetcode 30 1.题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words [“ab”,“cd”,“ef”], …

PyTorch之线性回归

1.定义: 回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。线性回归是利用称为线性回归方程的最小二乘函数,对一个或多个自变量和因变量之间关系,进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参…

LeetCode——1962. 移除石子使总数最小

通过万岁!!! 题目:给你一个数组。数组中的元素表示石子的个数,我们可以从里面移除一些元素,溢出的规则是第i位置的元素除2后向下取整。并且可以移除k次,要求最后的石子总个数最小。思路一&…

生成allure报告出现:ALLURE REPORT UNKNOWN

问题:点击浏览器查看时无法查看到报告 错误代码: if __name__ "__main__":pytest.main([./test_study/test_fixture.py])os.system("allure generate ./temps -o ./temps --clean") 结果导向: 解决:因为…

Hadoop入门学习笔记——四、MapReduce的框架配置和YARN的部署

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 四、MapReduce的框架配置和YARN的部署4.1. 配置MapReduce…

动态规划03-01背包问题

问题描述 作为动态规划中最重要的经典例题,01背包问题开启了我们学习二维dp数组的道路。 题目如下: 有一个容量为V的背包,还有n个物体。现在忽略物体实际几何形状,我们认为只要背包的剩余容量大于等于物体体积,那就可…

缓存高可用:缓存如何保证高可用?

前面我们提到了缓存集群的负载均衡策略,保证缓存服务的高可用,集群策略是最常用的,本文我们以 Redis 为例,分析一下单点缓存如何扩展到集群,以及集群部署的几种常见模式。 Redis 的主从复制 集群实现依靠副本&#x…

爬虫字典生成工具,CeWL使用教程

爬虫字典生成工具,CeWL使用教程 1.工具概述2.参数解析3.使用实例1.工具概述 CeWL 是一个 ruby 应用程序,它将给定的 URL 爬到指定的深度,可以选择跟随外部链接,并返回一个单词列表,然后可用于密码破解者 Cewl 是黑客武器库中的强大工具,因为它允许创建有针对性的单词列…