您现在的位置是:首页 > 文章详情

python:for-else和while-else应用

日期:2020-03-16点击:484

出现场景

今天的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业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章