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显得更加简洁,且不用再设置一个标志变量。

参考

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/750139

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。