2017-05-23 11 views
0

文字列に文字が表示される回数を数えようとしていますので、count()関数を使用していますが、count()関数を複数使用すると、 10 +以上の文字を数えようとしています。複数の部分文字列をカウントするPython

def printer_error(s): 
#errorLetters = ('r','s','t','u','v','w','x','y','z') 
errorRate = s.count('o') + s.count('p') + s.count('q') 


print(errorRate) 
return 

printer_error('aaaxbbbbyyhwawiwjjjwwm') 

私の最初の試みは、s.count(errorLetters)だったが、count()関数は、タプルやリストを取ることができないので、それが失敗しました。

現在のコードは私が望む結果を与えていますが、errorLetters変数のコメントアウトされた文字の残りの部分を連結する必要があります。これを行う別の方法は20+連結を必要としませんか?

+0

を私はアルファベット順にそれを維持したいが、私は 'で、事前にそれを尋ねてみたので、現在記載されたエラーレート変数は何もカウントされません。 wとyを得て、私が望む結果を得ました。 – bittercold

+0

私たちはコメントにdownvoteできないのは残念です。 @ewczの提案は良くないので、ループの中で 's.count'を使うのは無駄です。 – wim

+0

@wim fair enough;) 'sum([1ならば1、cならerrorLetters else 0ならc])' – ewcz

答えて

2

これを実行する最良の方法は、sを1回、つまりO(n)だけ繰り返す必要があります。

標準ライブラリcollectionsモジュールが便利で効率的になりますCounterオブジェクト提供:

>>> s = 'aaaxbbbbyyhwawiwjjjwwm' 
>>> errorLetters = ('r','s','t','u','v','w','x','y','z') 
>>> from collections import Counter 
>>> counts = Counter(s) 
>>> sum(counts[k] for k in errorLetters) 
8 
+0

これは素晴らしい作品です – bittercold

関連する問題