Python 2.7では、次の文字列を指定します。
スポットは茶色の犬です。スポットは茶色の髪です。スポットの髪は茶色です。
文字列内の「スポット」、「ブラウン」、「ヘア」の合計量を見つけるための最良の方法は何でしょうか。この例では、8を返します。
私は次のようなものを探していstring.count("Spot","brown","hair")
ますが、タプルまたはリスト内の「検出される文字列」で機能します。
ありがとう!
これはあなたが要求したことを行いますが、「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
私は使用するかもしれません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だけであるため)