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

2024-05-14 20:02:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python2.7中,给定以下字符串:

Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.

找到串中“斑点”、“棕色”和“头发”的总和的最佳方法是什么?在本例中,它将返回8。

我正在寻找类似于string.count("Spot","brown","hair")的内容,但可以使用元组或列表中的“要找到的字符串”。

谢谢!


Tags: ofthe方法字符串ishasdog棕色
2条回答

我可以使用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'是单独的计数器项,因此这将被1计为不足。

一个稍微不那么优雅的解决方案,它不会在标点符号上出错,它使用正则表达式:

>>> 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是唯一一个有真实世界数据的对象)

这是你所要求的,但要注意,它也会计算像“毛茸茸的”,“布朗纳”等词

>>> 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 package

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

相关问题 更多 >

    热门问题