Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Python】文字の出現回数を数える構文がわからない

解決したいこと

初心者で現在Pythonを勉強中ですが、文字の出現回数を数える構文の穴埋めをできず先に進めません。
下記問題の解答と解説を頂けませんでしょうか。

発生している問題・エラー

【問題】
英小文字だけからなる文字列sを対象に,どの文字が何回出現するかを数えたい。最終的にd_countにdの出現回数が代入されるよう,それぞれの空欄に入れるべきものを,順にコンマ区切りで並べて答えなさい。空欄1から「abc」「cde」「efg」なら,「abc,cde,efg」のように答えなさい。また,本来あるべき空白は取り除いて入力しなさい。

s = "myfellowcitizensistandheretoday"
count = [0]*[空欄1] # 文字の出現回数を数えるリスト
for c in s:
idx = ord(c)-ord('a')
count[idx] = [空欄2]

d_count = [空欄3]

自分で試したこと

[空欄1]は、アルファベットが26文字という点から26
[空欄2]は、理由はわかりませんが似たような構文から[IDX]+1じゃないかと思います。
[空欄3]は、count[idx]だと思いました。
実際に穴埋めして実行してprintすると2と表示されたので合っているようにも見えたのですが、
不正解と表示されます。

0 likes

2Answer

空欄1:正解
空欄2:不正解??? // IDXは存在しませんし, 要素数1の配列[idx]と1との和だとしても動作しません.
空欄3:不正解

理由はわかりませんが

プログラムは思った通りには動きません.書いた通りに動きます.

実際に穴埋めして実行してprintすると2と表示されたので合っているようにも見えた

実行して表示された2について解説しますので,解答を考えてみてください.

for c in s:
	idx = ord(c) - ord('a')
	count[idx] = [空欄2]

の部分で,idxの数字に着目して解説を行います.

このfor文は,foreachの形式を取っており,文字列sから文字を1つずつcに取り出して実行されます.
for文が終わるときは,s="myfellowcitizensistandheretoday"の一番最後の文字'y'が変数cに入ってord(c) - ord('a')が計算され,変数idxに代入されます.
変数cを文字'y'で考えると,idx = ord('y')-ord('a')ということですね.

ord('a')は整数97ord('y')は整数121ですので,この差は24ですね.この数字は,アルファベットの何番目かであるかの数字になり,idxに入ります(0スタートである番目になることに注意).

[空欄3]は、count[idx]だと思いました。

ということであれば,for文が終わった後にidxに入っている値は文字'y'を使って演算された24ですので,実際に実行されるこのcount[idx]だと思っていらしているものはcount[24]ということになります.
アルファベット24番目である'y'は文字列sの中に2回出現しているので,2が出力されて当然.ということですね.

問題は

d_countにdの出現回数が代入

ということですので,'d'がアルファベットの何番目にあるかを考えれば良いのではないでしょうか.
空欄3はcount['d'がアルファベットの何番目にあるか]が答えになりそうですね.

コードが動いてcount[idx]で2が出力されたのであれば空欄2に関してはおそらく正しく実装されているのだと思いますが,如何せんトンデモフィーリングで書かれたみたいなのでなんとも言えません.
実際に描いてみたコードも示していただけると助かります.

3Like

Comments

  1. 質問中にコードを書かれる場合は,コードブロック

    ```言語名:タイトル
    コード本文
    ```
    の中に記述していただけると見やすくなります.検討お願いします.
  2. 正解できたようでよかったです.
    残念ながらここのリプ欄だけはMarkdownが認識されないようで,上記でなかなかうまく書けているものの反映されません...

    count[idx] = count[idx] + 1
    の意味ですが,ひとことで言えば「count[idx]の値を1つだけ大きくする」です.「インクリメントする」ともいいます.
    2回もcount[idx]を書くのは面倒なので
    count[idx] += 1
    と書くこともでき,同じ意味を持ちます.

    最初はcountの全ての要素の値が0ですが,文字列sを見ていくごとに値がどんどん大きくなっていくようになりますので,今回の要件を満たす実装となりました.

    さらに問題の範囲から出て言うと,
    s.count('d')と書くだけで'd'の個数をカウントしてくれる機能がPythonには備わっています.
    機能の良さで言えば問題で示されている手法の方が,全てのアルファベットをカウントしているので上位互換と言えるのではないでしょうか.

    最後に,本質問を「クローズ」にしていただければ終了になります.
    お疲れ様でした.
  3. @PondVillege様

    ご返信遅くなりまして申し訳ございません。
    追加でご解説頂きましてありがとうございます。

    値を一つずつ大きくしていくという意味になっていること理解できました。

    質問の仕方や記載方法まで丁寧にご教授頂きありがとうございました。
    これにて質問をクローズさせて頂きます。

@PondVillege 様

丁寧に解説頂きましてありがとうございました。

for文の仕組みとidxの中身がよく理解できていませんでしたが、理解が進みました。

[空欄2]の解答count[idx]+1+1の意味合いだけは今でも理解できていませんが、
正しいコードを導き出すことができました。

実際に書いたコードは下記の通りです。

s = "myfellowcitizensistandheretoday"
count = [0]*26 # [空欄1]
for c in s:
idx = ord(c)-ord('a')
count[idx] = count[idx]+1 # [空欄2]

d_count = count[3] # [空欄3]

こういったサイトに質問をあげるのを初めてで、見づらかったり理解しにくい内容で
あったにも関わらず、丁寧に教えて頂きましてありがとうございました。
質問を投稿する側としてのリテラシーも上げていきたいと思います。
ありがとうございました。

1Like

Your answer might help someone💌