2

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

Spot是一只棕色的狗。斑点有棕色的头发。Spot的头发是棕色的。

在字符串中找到“Spot”、“brown”和“hair”的总和的最佳方法是什么?在示例中,它将返回 8。

我正在寻找类似string.count("Spot","brown","hair")但与元组或列表中的“要找到的字符串”一起使用的东西。

谢谢!

4

2 回答 2

12

这可以满足您的要求,但请注意,它还会计算“hairy”、“brown”等词。

>>> 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
于 2013-03-19T00:50:22.910 回答
3

我可能会使用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))

请注意,这将少计 1,因为'brown.''brown'是单独的 Counter 条目。

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

>>> 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 是唯一具有现实世界数据的)

于 2013-03-19T00:49:15.313 回答