これは、を使用した単純なPythonバージョンdefaultdict()
です。これはクラス用だと言ったので、これはあなたが要求した最終的な解決策ではありません。
from collections import defaultdict
from operator import itemgetter
d = defaultdict(int)
name = raw_input("Enter file name: ")
with open(name, "r") as f:
for line in f:
for ch in line:
if ch.isalpha():
d[ch] += 1
lst = d.items()
# sort twice: once for alphabetical order, then for frequency (descending).
# Because the Python sort is "stable", we will end up with descending
# frequency, but alphabetical order for any frequency values that are equal.
lst.sort(key=itemgetter(0))
lst.sort(key=itemgetter(1), reverse=True)
for key, value in lst:
print value, key,
ここのように、開いているファイルでforループを実行するとfor line in f
、Pythonは入力ファイルから一度に1行を取得します。次に、入力行で一度に1文字ずつループします。次に、それが文字であるかどうかを確認し、そうである場合は、文字の頻度カウントをインクリメントします。
このコードにはバグがあります。すべての文字の頻度をすべて小文字であるかのようにカウントする必要がありますが、このコードでは、1つのカウントが大文字で、別のカウントが小文字で保持されます。カウントが小文字のみになるようにこれを変更する方法を理解できると確信しています。
カウントが完了したら、.items()
メソッド関数を使用して(key, value)
タプルのリストを取得します。例:('h', 3)
は、辞書のキー文字h
とその値、カウント3を持つタプルです。
次に、並べ替えます。Pythonが実行できる巧妙なトリックを紹介します。並べ替えは「安定した」並べ替えであるため、複数の並べ替えを行う場合、Pythonは必要がない限り以前の並べ替えの結果を妨げません。つまり、最初にアルファベット順に並べ替え、次に頻度カウントで並べ替えると、頻度カウントが等しいすべての場合に、その頻度内でアルファベット順になります。したがって、、、a
およびb
はc
すべて同じ頻度であるため(それぞれが一度表示される)、出力の一部は次のようになります。1 a 1 b 1 c
今、私は少しトリッキーですが、これは学ぶのに良いです。sort関数はkey
、sortを制御するという引数を取ることができます。 key
ソートに使用する値を返す関数である必要があります。タプルのリストがあるので、タプルの一部を取得して返すことができるキー関数が必要です。2つの関数を書くことができます:
def get_key(kv_tuple):
return kv_tuple[0]
def get_value(kv_tuple):
return kv_tuple[1]
しかし、Pythonには、operator.itemgetter()
使用できる関数、があります。タプルのどの位置を取得したいかを指示するだけで、タプルの一部を取得する重要な機能になります。
最初に頻度を最大値でソートする必要があるreverse=True
ため、メソッドの引数も設定します.sort()
。
最後に、キー、値のタプルのリストをループして印刷します。
このコードには別の問題があります。出力例は、すべての文字をリストに含めたいことを示しています。文字が入力に含まれていなかった場合は、カウントが0になります。これはそこにあったものだけを数えます。
したがって、このコードを書き直すことをお勧めします。を使用する代わりにdefaultdict
、通常のを使用してみてください。ただし、各文字をカウント0のにdict
設定するループがあります。a
z
dict
dict
また、カウントしたい文字を含む通常の文字を取得したら、カウントするかどうかを決定するコードを変更することをお勧めします。現在、.isalpha()
メソッド関数を使用して、文字をカウントするかどうかを決定しています。in
代わりに、文字が辞書であるかどうかを確認できます。次に、このコードを使用して、句読点や数字、または任意の種類の文字をカウントできます。