题目
一些思路
本质上是一个判断字符串是否包含子字符串的问题,可以用str.find(),str.index(), xx in xxx 等方法
我的代码
def count_words(text: str, words: set) -> int:
#依次判断words里面的word是否在text出现
count = 0
text = text.lower()
for word in words:
if word in text:
count += 1
return count
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert count_words("How aresjfhdskfhskd you?", {"how", "are", "you", "hello"}) == 3, "Example"
assert count_words("Bananas, give me bananas!!!", {"banana", "bananas"}) == 2, "BANANAS!"
assert count_words("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",
{"sum", "hamlet", "infinity", "anything"}) == 1, "Weird text"
print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")
clear code
用了序列化,一行搞定
def count_words(text, words):
return sum(w in text.lower() for w in words)
creative code
lambda表示
count_words=lambda t,W:sum(w in t.lower()for w in W)
speedy code
- 用了filter函数,一个原因可能是用了内置的C代码,大数据量的时候会快很多。但这个方法一个是会创建tuple,耗时还有大数据量可能会占用很多内存,还有一个在用count函数时涉及到一个指针遍历字符串的问题。
- 我的方法在循环外面先把text小写化,所以这个方法和我的比起来还是要慢一些,做了下测试也是如此
def count_words(text, words):
return len(list(filter(text.lower().count, words)))
- 测试结果,1是我的代码时间,2是用filter的时间: