判断句子中的有效单词数。
题目比较简单,将句子拆分成单词,然后判断单词是否有效。
但是“有效”条件有点繁琐:
如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
1.不含数字
2.至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)。
3.至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
官方题解:
class Solution:
def countValidWords(self, sentence: str) -> int:
def valid(s):
hasHyphens = False
for i, ch in enumerate(s):
if ch.isdigit() or ch in "!.," and i < len(s)-1:
return False
if ch == '-':
if hasHyphens or i==0 or i== len(s)-1 or not s[i-1].islower() or not s[i+1].islower():
return False
hasHyphens = True
return True
return sum(valid(s) for s in sentence.split())
自己写的:
前几遍没过,容易漏条件。
class Solution:
def countValidWords(self, sentence: str) -> int:
tokens = sentence.split()
count = 0
print(tokens)
for token in tokens:
istoken = True
hasHyphens = False
for i,x in enumerate(token):
if x.isdigit():
istoken = False
break
if x in "!.," and i != len(token)-1:
istoken = False
break
if x == '-':
if hasHyphens or i==0 or i== len(token)-1 or not token[i-1].islower() or not token[i+1].islower():
istoken = False
break
hasHyphens = True
if istoken and token:
count += 1
return count
补充:
学到的三个简化代码方法:
一、enumerate(iterable,start=0)返回一个枚举对象,里面包含一个计数值和迭代对象iterable生成的值。
该方法等价于:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
内置函数 — Python 3.10.2 文档
二、sum
(iterable, /, start=0) 也可以对[True,True,False]这样布尔类型求和,返回其中True个数。
从 start 开始自左向右对 iterable 的项求和并返回总计值。 iterable 的项通常为数字,而 start 值则不允许为字符串。
三、用 in 代替多个== or == or ==
如: ch in "!.,"
x in [1,3,5],