2

Python 2.7では、次の文字列を指定します。

スポットは茶色の犬です。スポットは茶色の髪です。スポットの髪は茶色です。

文字列内の「スポット」、「ブラウン」、「ヘア」の合計量を見つけるための最良の方法は何でしょうか。この例では、8を返します。

私は次のようなものを探していstring.count("Spot","brown","hair")ますが、タプルまたはリスト内の「検出される文字列」で機能します。

ありがとう!

4

2 に答える 2

12

これはあなたが要求したことを行いますが、「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
于 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))

'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だけであるため)

于 2013-03-19T00:49:15.313 に答える