计算多个字符串在另一个字符串中出现的次数

4 投票
2 回答
12282 浏览
提问于 2025-04-17 19:35

在Python 2.7中,给定这个字符串:

Spot是一只棕色的狗。Spot有棕色的毛发。Spot的毛发是棕色的。

那么,找出字符串中“Spot”、“brown”和“hair”出现的总次数,最好的方法是什么呢?在这个例子中,结果应该是8。

我想要的功能类似于string.count("Spot","brown","hair"),但希望能用一个元组或列表来处理要查找的字符串。

谢谢!

2 个回答

4

我可能会使用一个 Counter

s = 'Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.'
words_we_want = ("Spot","brown","hair")
from collections import Counter
data = Counter(s.split())
print (sum(data[word] for word in words_we_want))

需要注意的是,这样会少算一个,因为 'brown.''brown' 被当作两个不同的计数项。

还有一种稍微不那么优雅的解决方案,它不会因为标点符号而出错,使用了正则表达式:

>>> len(re.findall('Spot|brown|hair','Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.'))
8

你可以通过一个元组来创建这个正则表达式,方法很简单:

'|'.join(re.escape(x) for x in words_we_want)

这些解决方案的好处在于,它们的算法复杂度比 gnibbler 的方案要好得多。当然,哪种方案在实际数据中表现更好,还需要 OP 来测量,因为 OP 是唯一拥有真实数据的人。

13

这个代码实现了你想要的功能,但要注意,它也会把像“hairy”(毛茸茸的)、“browner”(更棕色的)这样的词算进去。

>>> s = "Spot is a brown dog. Spot has brown hair. The hair of Spot is brown."
>>> sum(s.count(x) for x in ("Spot", "brown", "hair"))
8

你也可以把它写成一个 map

>>> sum(map(s.count, ("Spot", "brown", "hair")))
8

一个更强大的解决方案可能会使用 nltk包

>>> import nltk  # Natural Language Toolkit
>>> from collections import Counter
>>> sum(x in {"Spot", "brown", "hair"} for x in nltk.wordpunct_tokenize(s))
8

撰写回答