2017-11-23 5 views
2

私はクラスをとっているPython初心者です。私は各文字が何回文字列に現れるかを調べなければなりません。私はカウントとカウンターについてのすべての反応を見てきましたが、これはまだカバーされていません。私は自分の文字列を取り、文字のリストを作成したので、一度しか表示されませんでした。それから、リストの文字が文字列に何回現れるかを数えようとしましたが、それを動作させることができません。私は特定の手紙を確認する方法を知っていますが、自分のリスト内の各手紙を確認することはできません。プログラムは以下のとおりです(追加のコードがいくつかありますが、正しくカウントしていることを確認するために使用しています)。 [ 'S'、 'U'、 'K'、 '私は' ''、 'W'、 'E'、 'T':私はこれを実行すると文字列のリストが何回文字列に現れるかをカウントする - Python(カウントもカウンターもない)

# CONSTANTS and Blank Lists 
letter_list = [] 
count = 0 
letter_count = [] 
index = 0 

# Begin programming 
my_string = 'SUKI IS SWEET' 

for ch in my_string: 
    if ch not in letter_list: 
     letter_list.append(ch) 
print(letter_list) 
print() 

for ch in my_string: 
    if letter_list[index] == ch: 
     count = count + 1 
letter_count.append(count) 

# Double-checks to make sure running properly   
print(letter_list[0],'appears',letter_count[0], 'times') 
print() 
print(letter_count) 
print() 

は、私は適切な答えを得ます(私のletter_list) Sは、私は私のletter_count.appendが間違った場所にあることを知っている、しかし3回(Sは3回表示されません) [3](私のletter_count)

を表示されます。しかし、私はそれを移動すると、それはジャックアップされます。そして、私は、インデックスを増やすことで、それに沿って移動しようとした瞬間は、それが(下記参照)まで吹く:

# CONSTANTS and Blank Lists 
letter_list = [] 
count = 0 
letter_count = [] 
index = 0 

# Begin programming 
my_string = 'SUKI IS SWEET' 

for ch in my_string: 
    if ch not in letter_list: 
     letter_list.append(ch) 
print(letter_list) 
print() 

for ch in my_string: 
    if letter_list[index] == ch: 
     count = count + 1 
    letter_count.append(count) 
    index = index + 1 

# Double-checks to make sure running properly   
print(letter_list[0],'appears',letter_count[0], 'times') 
print() 
print(letter_count) 
print() 

結果: トレースバック(最新の呼び出しの最後): ファイルを「C:\ユーザーはローグ\を\しますディレクトリ30のmain() ファイル「C:\ Users \ Rogue \ Desktop \ TEST_2.py」、行18、メイン の場合letter_list [index] == ch: IndexError:リストのインデックスが範囲外です

私はこれを悪くしています。しかし、私が何をしても、私はこれを働かせることはできません。助けてください!

+2

辞書をカバーしましたか? – RoadRunner

+1

組み込みの 'sorted'関数や' .sort'メソッドのリストを使用することはできますか? –

答えて

2

index out of rangeエラーがindexがあなたの元の文字列(13文字)の大きさであることに由来しますが、使用しますそれはletter_listにあり、一意の文字の数(8個の一意の文字)として大きくなります。

ここにコードの修正版があります。それは効率的ではないが、それが動作し、dict秒またはCounter秒を必要としない:

letter_list = [] 
letter_count = [] 

# Begin programming 
my_string = 'SUKI IS SWEET' 

# Create a list of unique characters 
for ch in my_string: 
    if ch not in letter_list: 
     letter_list.append(ch) 
     letter_count.append(0) 

# Increment values in letter_count 
for ch in my_string: 
    for index in range(len(letter_list)): 
     if letter_list[index] == ch: 
      letter_count[index] += 1 

# Double-checks to make sure running properly  
print(letter_list) 
print(letter_count) 

for index in range(len(letter_list)): 
    print("'" + letter_list[index] + "'",'appears',letter_count[index], 'times') 

これは、出力:

['S', 'U', 'K', 'I', ' ', 'W', 'E', 'T'] 
[3, 1, 1, 2, 2, 1, 2, 1] 

'S' appears 3 times 
'U' appears 1 times 
'K' appears 1 times 
'I' appears 2 times 
' ' appears 2 times 
'W' appears 1 times 
'E' appears 2 times 
'T' appears 1 times 
+1

誰もが助けてくれて助かりました。でも、あなたのことは私がやろうとしていたことに最も近いものでした。私はこのようなことをする簡単な方法が必要であることを知っているので私はとても不満を抱いていますが、私たちはまだどのように学んでいません。よりシンプルなコードを使うのを待つことはできません。 – Rogue

+0

@Rogue:私の喜び。フィードバックをお寄せいただきありがとうございました! Pythonは非常に有益です。 –

2

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

count = {} 
my_string = 'SUKI IS SWEET' 
for i in my_string: 
    if i in count: #check if it exists in dictionary 
     count[i] += 1 
    else: 
     count[i] = 1 #first occurrence of character 

print(count) 

出力:

{' ': 2, 'E': 2, 'I': 2, 'K': 1, 'S': 3, 'U': 1, 'T': 1, 'W': 1} 
1

あなたが使用を許可されている場合は、これを行うには非常に単純な方法がありますPythonに組み込まれたsortedの機能

文字列のソートされたリストを作成し、その文字を変更する場所を探してリストをスキャンします。変更が見つかると、前のグループは終了しているので、その文字とその数を表示します。

ループの開始時に、空の文字列で構成される偽のグループがあるため、その偽のグループの印刷手順をスキップする必要があります。ループの最後に、最後のグループの情報が表示されます。

my_string = 'SUKI IS SWEET' 
last, count = '', 0 
for c in sorted(my_string): 
    if c != last != '': 
     print(last, count) 
     count = 0 
    last = c 
    count += 1 
print(last, count) 

出力

2 
E 2 
I 2 
K 1 
S 3 
T 1 
U 1 
W 1 
1

主な問題はindexがあなたのインデックスエラーの原因となっているletter_listの実際のサイズよりもはるかに大きく増加しているということです。 letter_listletter_countのリストが平行で同じ長さであることを確認する必要があります。そうしないと、アクセスエラーが多すぎる可能性があります。文字と、それぞれの周波数を追跡する並列リストを持つのと同じ方法を使用しています

def count_frequency(text): 
    letters = [] 
    freqs = [] 

    ordered_list = sorted(text) 

    for letter in ordered_list: 
     if letter not in letters: 
      letters.append(letter) 
      freqs.append(1) 
     else: 
      letter_loc = letters.index(letter) 
      freqs[letter_loc] += 1 

    return letters, freqs 

:ここ

は、このコードを書くの別の方法です。 sortedを使用してリストを事前にソートし、文字と頻度を含むタプルを返します。

あなたはその後、ちょうどあなたが一度に2つの同じサイズのリストをループすることができますzipを使用して、うまくこれを印刷することができます:

letter_freqs = count_frequency('SUKI IS SWEET') 

for letter, freq in zip(letter_freqs[0], letter_freqs[1]): 
    print(letter, "appears", freq, "times") 

は出力:

appears 2 times 
E appears 2 times 
I appears 2 times 
K appears 1 times 
S appears 3 times 
T appears 1 times 
U appears 1 times 
W appears 1 times 

あなたがこの種のことがわかります今後の辞書やカウンタでは、作業がはるかに簡単です。

関連する問題