2017-11-12 5 views
5
class MyString: 
    def __init__(self, myString): 
     self.__myString = myString 

    def countWord(self): 
     count = len(self.__myString.split()) 
     return count 

    def findMostFrequentChar(self): 
     # ? 

findMostFrequenctCharを実装する必要があります。彼女が私たちに与えた唯一のヒントは、2つのリストを作る必要があったということでした。これは彼女が私を失ったところです。文字列内で最も頻繁に使用される文字を数えるには?

ここで関数を呼び出すコードです:私は輸入せずに辞書を用いて通常の文字列の中で最も頻繁に手紙を取得する方法を紹介します

def main(): 
    aString = MyString("This is a super long long long string. Please help count me") 
    print("There are", aString.countWord(), "words in the string.") 

    count, letter = aString.findMostFrequentChar() 
    print("The most frequent character is", letter, "which appeared", count, "times") 

main() 
+0

。 2つのアイデアのリストをスクラップします。 – timgeb

+0

これは宿題ですか?これは宿題では問題ありませんが、良い方法ではキャッシュが必要です。文字列が変更されない場合、この値を事前計算してオブジェクト属性として一度保存すると意味があります。さもなければ、この機能をクラスから分離し、代わりにあなたの計算を行う独立した関数を定義してください。 –

答えて

1

私はカウントを格納するためにdictを使用します。 しかし、最初に私はすべてspacesと他の記号を削除したいと思っています。私はまた、&の小文字を同じものとして数えたいと思います。

dictがすべての私の値で構築されるとき、私はmax関数を使用します。 maxは反復可能なので、dictをタプルの "リスト"として渡します(key, val)。タプルの2番目の要素(val)をkey-argにするラムダ関数を与えるために、比較対象を決定する方法をmaxに伝える必要があります。

返された場合、最大値はタプルの最大値がvalになります。

class MyString: 

    def __init__(self, myString): 
     self.__myString = myString 

    def countWord(self): 
     count = len(self.__myString.split()) 
     return count 

    def findMostFrequentChar(self): 
     counter = {} 
     # Instead of performing various modifications on the string 
     # one can instead filter all the undesired chars. 
     # new_string = self.__myString.replace(' ', '').lower() 
     new_string = list(filter(lambda x: 'a' >= x <= 'z', self.__myString.lower())) 
     for char in new_string: 

      if char in counter: 
       counter[char] += 1 
      else: 
       counter[char] = 1 

     key, value = max(counter.items(), key=lambda x:x[1]) 
     return value, key 


def main(): 
    aString = MyString("This is a super long long long string. Please help count me") 
    print("There are", aString.countWord(), "words in the string.") 

    count, letter = aString.findMostFrequentChar() 
    print("The most frequent character is", letter, "which appeared", count, "times") 

main() 
+0

このコードは実行されません。どうすれば実行できますか? – AmbieGirl

+0

正常に動作しているはずです。どのようなエラーが出ますか? –

+0

ファイル "C:/Users/abrooks3/Downloads/assignment9.py"、行31、メイン 件数、文字= aString.findMostFrequentChar() ファイル "C:/Users/abrooks3/Downloads/assignment9.py"、行2135、findMostFrequentChar AttributeError: 'dict'オブジェクトに 'iteritems'属性がありません >>> – AmbieGirl

1

が。あなたの仕事はそれに応じてクラスを調整することです。

私は、2つ以上の文字が最高の頻度を共有する場合、そのいずれかが有効な結果であると仮定します。あなたがcollections.Counter、 おそらくないにも辞書を使用することができないことを意味すると思わ

>>> s = 'aabacbcd' 
>>> counts = {} 
>>> for c in s: 
...  counts[c] = counts.get(c, 0) + 1 
... 
>>> counts 
{'a': 3, 'c': 2, 'b': 2, 'd': 1} 
>>> max(counts, key=counts.get) 
'a' 
4

The only hint she gave us was that we needed to make 2 lists. and this is where she lost me.

文字が英語のアルファベットとして定義されていると仮定すると、 は1つのリストで十分です。 その場合、0に初期化された26個の項目のリストを作成することができます。 その後、文字列の文字を反復することができます。 英字の各文字に対して、n一覧では、nはアルファベットの文字のインデックスです。

26零点のリストを作成します:入力文字列sの文字を超える

counts = [0] * 26 

ループ:文字が文字であることを

for c in s: 

チェック:

if 'a' <= c.lower() <= 'z' 

をアルファベットの文字の0から始まるインデックスを計算し、カウントをインクリメントします。

index = ord(c.lower()) - ord('a') 
counts[index] += 1 

あなたはカウント、 を持っていたら、あなたは 、(練習問題として、あなたのため左)の最大値を持つインデックスを見つけて、chr(index + ord('a'))に対応する文字を取得することができます。

2

あなたはcollectionsモジュールからCounterを使用することができた場合:Counterは問題外である場合

from collections import Counter 

def findMostFrequentChar(self): 
    d = Counter(self.__myString.replace(' ', '').lower())   
    return d.most_common()[0] 

def findMostFrequentChar(self): 
    d = {} 

    for ch in self.__myString.replace(' ', '').lower(): 
     if ch in d: 
      d[ch] += 1 
     else: 
      d[ch] = 1 

    most_frequent = max(d, key=d.get) 
    return most_frequent, d[most_frequent] 

は完全にそれを置く:

class MyString: 
    def __init__(self, myString): 
     self.__myString = myString 

    def countWord(self): 
     count = len(self.__myString.split()) 
     return count 

    def findMostFrequentChar(self):   
     d = {} 

     for ch in self.__myString.replace(' ', '').lower(): 
      if ch in d: 
       d[ch] += 1 
      else: 
       d[ch] = 1 
     most_frequent = max(d, key=d.get) 
     return most_frequent, d[most_frequent] 


def main():  
    aString = MyString("This is a super long long long string. Please help count me") 
    print("There are", aString.countWord(), "words in the string.") 

    letter, count = aString.findMostFrequentChar() 
    print("The most frequent character is", letter, "which appeared", count, "times") 

main() 
3

あなたはsortedを使用することができます。

class String: 
    def __init__(self, s): 
     self.s = s 
    def findMostFrequentChar(self): 
     return sorted([(a, self.s.count(a)) for a in self.s], key=lambda x:x[-1])[-1] 
+0

最も頻繁に使用されているcharが見つかりました。しかしカウントは欠けている。 –

+0

@DavidBern OPは、 'findMostFrequenctChar'だけを実装しなければならないと言っていました。 – Ajax1234

+1

これを実装することによって、この 'count、letter = aString.findMostFrequentChar()'が好きなときはテストが失敗します。 –

0

「2つのリスト」の部分が刺激性です。一つの実用的なツールは、しかし、collections.CounterであるPythonでイテラブルの要素をカウントする: `collections.Counter`は問題外である場合は、各文字をカウントするために辞書を使用し、

from collections import Counter 

# ... 
    def findMostFrequentChar(self): 
     return Counter(self.__myString).most_common()[0][0] 
関連する問題