あなたの主な問題は、ではなく、0
のインデックスを見つけるために各文字からord("a")
(97)を減算する必要があることでした。
しかし、他の非効率的で悪い習慣やものがたくさんあったので、残りのコードもクリーンアップしました。特に
def countchar(sentence):
list1 = [0 for i in range(26)]
for c in sentence:
if 'a' <= c <= 'z':
list1[ord(c) - ord("a")] += 1
return list1
if __name__ == "__main__":
string = " GOOD morning and have a nice day"
string = string.lower()
print countchar(string)
、それは変数名としてstr
のようなキーワードを使用するには悪い習慣です。
また、これを行う予定に応じて、dictionaryがリストよりもあなたの目的に適している可能性があります。
ここで辞書を使用して(それはすべての文字だけでなく、小文字を数えます追加機能付き)迅速な書き換えです:
コメントで要求されるように
def countchar(sentence):
char_dict = {}
for c in sentence:
if c in char_dict:
char_dict[c] += 1
else:
char_dict[c] = 1
return char_dict
if __name__ == "__main__":
string = " GOOD morning and have a nice day!!"
print "With uppercase (and punctuation, etc):"
print countchar(string)
print "All lowercase (and punctuation, etc):"
string = string.lower()
print countchar(string)
、ここでは次のいくつかの明確化があります行:
list1[ord(c) - ord("a")] += 1
最初に内側を見てみましょう。ord(c) - ord("a")
c
は、その中に1文字しか含まれていない文字列なので、ord(c)
はその文字列のASCII値を返します。小文字を0,1、...、25の数字にマッピングするので、文字 "a"が0にマップされるようにする必要があります。ASCIIでは、文字はシーケンシャル(a = 97、 B = 98、...、Z = 122)、それから私達はちょうどそれらをマッピングするために、各1から最小の1を引くことができます。
a --> 97-97 = 0
b --> 98-97 = 1
c --> 99-97 = 2
...
z --> 122-97 = 25
だからord(c) - ord("a")
がやっているものです。各値から97(これはord("a")
の値)を減算し、0〜25の数値を与えます。
list1[ that number between 0 and 25 ] += 1
list1
で適切なインデックスを増分します。
ありがとうございます。私は緑の手であるので、私は完全に理解できませんでした** list1 [ord(c) - ord( "a")] + = 1 **このステップ。あなたは私のためにそれをもっとはっきりと説明できますか? –
@CharlieCai答えに説明を追加しました。 upvoteとそれを受け入れることを忘れないでくださいあなたのために働く場合! :-) –