云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!
出现场景
今天的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显得更加简洁,且不用再设置一个标志变量。
参考
- Python Tip 1:Python循环语句中的else语法(for else, while else)
- python 中的 for-else 和 while-else 语句
- leetcode1106
云栖号在线课堂,每天都有产品技术专家分享
立即加入圈子:https://c.tb.cn/F3.Z8gvnK
与专家面对面,及时了解课程最新动态!
原文发布时间:2020-03-17
本文作者:uncle_ll
本文来自:“阿里云云栖社区”,了解相关信息可以关注“阿里云云栖社区”