python:for-else和while-else应用
出现场景
今天的leetcode每日一题中遇到这种写法,第一次用到,感觉很神奇,省去了很多不必要的步骤。
题目:1160. 拼写单词
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写时,chars 中的每个字母都只能用一次。
返回词汇表 words 中你掌握的所有单词的长度之和。
输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
方法:hashmap进行字符数量比对,如果chars中的字符数量大于等于words中每个单词的字符数量,则表明该单词学会了。
class Solution: def countCharacters(self, words: List[str], chars: str) -> int: ans = 0 hashmap = {} for c in chars: hashmap[c] = 1 if c not in hashmap else hashmap[c] + 1 for word in words: hashmap2 = {} for w in word: hashmap2[w] = 1 if w not in hashmap2 else hashmap2[w] + 1 for k, v in hashmap2.items(): if k not in hashmap or v > hashmap[k]: break else: # 这里就是for-else ans += len(word) return ans
for-else
可以看到上面代码中的else是与for对齐,查阅相关资料介绍,Python是有这种写法,在Python 中,else 除了能与 if 配合外,还能和 for、while 配对使用。
官方说明:
Python循环语句(for, while)有可能带一个else分支,当一个for循环正常执行完毕时或者当一个while循环正常执行完毕(循环条件变为false)时它被触发执行,但是如果这个循环被break语句非正常中止时,则这个else分支不执行。
上面的代码正好需要这种需求,每个字符数量比较完毕后才决定是否更新ans,如果中途不满足就break,ans也不会被更新。
这里以while-else为例:
- 无break时候
i = 0 while i < 7: print(i) i += 1 else: print('no interrupt')
结果:
0 1 2 3 4 5 6 no interrupt
- 有break的时候
i = 0 while i < 7: print(i) i += 1 if i == 3: break else: print('no interrupt')
结果:
0 1 2
从上面两个对比中可以看到,如果break得到执行时,else操作不会得到执行。
这样的写法的好处在于可以减少状态flag来表示循环结果是如何,之前的写法是对循环结果用一个标志变量表示,最终依据标志变量来看是否执行else下的操作:
flag = 0 i = 0 while i < 7: print(i) i += 1 if i == 3: flag = 1 break if flag: print("has interrupt") else: print("has no interrupt")
比较繁琐,代码不够简洁。使用while-else显得更加简洁,且不用再设置一个标志变量。
参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
支撑阿里 99% 数据开发的 DataWorks 在技术架构变革方面的实践
DataWorks 是阿里巴巴自主研发,支撑阿里巴巴经济体 99% 数据业务建设和治理,每天数万名数据开发和算法开发工程师在使用。 从 2010 年起步到目前的版本,经历了多次技术变革和架构升级,也遗留了大量的历史包袱。技术的创新和业务的发展,相辅相成但也互为掣肘。存在需求接入慢,代码牵一发而动全身,环境复杂等问题,沉疴已久。历次迭代均未从根基上升级 DataWorks ,仅仅是一些性能提升、工程结构的优化,减少了重复代码等,并未促成根本性的技术革命。 本文将探讨如何通过当前大热的微服务架构,来改变 DataWorks 平台的现实问题,从繁杂的工程中探索出一条切实可行的技术架构变革之路。 痛点 让我们先来谈谈 DataWorks 当前遇到了哪些痛点,这些痛点是倒逼着我们进行技术变革的源动力。 沉重的历史包袱 首先要提的就是历史原因遗留的各种问题, DataWorks 历史上多个版本同步开发,前后端技术栈多次变革,应用一旦上线就很难废弃,一个对外暴露的 API ,很可能是 5 年前开发的,但依然有业务在依赖,通常情况下连这些古老业务的负责人都找不到了。当我们的服务正常运行的时候,无人搭理...
- 下一篇
JDK 14如期发布,16个新特性快速预览
JDK 14已经于2020年3月17日如期发布。本文介绍JDK 14特性。 JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言。 模式匹配允许程序中的通用逻辑,即从对象中有条件地提取组件,可以更简洁,更安全地表示。 这是JDK 14中的预览语言功能。 动机 几乎每个程序都包含某种逻辑,这些逻辑结合了对表达式是否具有某种类型或结构的测试,然后有条件地提取其状态的组件以进行进一步处理。例如,以下是在Java程序中常见的instanceof-and-cast用法: if (obj instanceof String) { String s = (String) obj; // 使用s } 上述示例中,为了能够安全地将obj转为我们期望的String类型,需要通过instanceof运算符对obj进行类型判断。这里发生了三件事: 测试obj是否是一个String 将obj转换为String 声明新的局部变量s,以便我们可以使用字符串值。 这种模式很简单,并且所有Java程序员都可以理解,但是由于一些原因,它不是最优的。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS关闭SELinux安全模块
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度