環境:Python3系,MacOS
文字列中の文字の出現回数をカウントするコードなのですが、理解ができません。
わかりやすく解説のほどお願い致します。
私の解釈では、
①まず、messageに文字列を格納し、countに空の辞書を格納。
②forループ制御文でmessageに格納された文字数(空欄含む)文だけ制御文内容実装する。
内容はcount.setdefault(character,0) → countにcharacterがなければ「0」を返す。
count[character]=count[character]+1 →理解できず。。。
③最後にforループ内で実装された内容をprintで返す。
message='It was a bright cold day in April, and the clocks were striking thirteen.' count={} for character in message: count.setdefault(character , 0) count[character]=count[character] +1 print(count)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
面白いコードですね :)
やはり味噌はこの行でしょうか
python
1 count[character]=count[character] +1
結論だけ申し上げますと、
「該当した文字だった場合、そのcount辞書型の該当の文字キーに1加算している」
という処理になりますね。
TL; DR(長ったらしい解説のため、読み飛ばし可能です)
その前に、まずはこのコードの実行結果を見たほうがよいでしょうか。
{'I': 1, 't': 6, ' ': 13, 'w': 2, 'a': 4, 's': 3, 'b': 1, 'r': 5, 'i': 6, 'g': 2, 'h': 3, 'c': 3, 'o': 2, 'l': 3, 'd': 3, 'y': 1, 'n': 4, 'A': 1, 'p': 1, ',': 1, 'e': 5, 'k': 2, '.': 1}
「そりゃそうだよ! そういう結果になったよ!(半ギレ)」
と思われるかもしれませんね。
じゃあ、
python
1 count[character]=count[character] +1
では何が行われているか、具体的に文字を入れながら見ていきましょう。
実際に文字を一文字ずつ入れてみる
"I" の動作
python
1message='It was a bright cold day in April, and the clocks were striking thirteen.' 2# now! ^ 3 4 count["I"]=count["I"] +1
ご覧の通り、 count
辞書型の I
というキーに、数値を1つ足してるんですね。
では、実際の数値はどうなっているでしょうか。
python
1message='It was a bright cold day in April, and the clocks were striking thirteen.' 2# now! ^ 3 4# 0 +1 5 count["I"]=count["I"] +1
ということが行われております。もちろん count
辞書の I
に 数値 0
が入っているのは、
python
1count.setdefault(character , 0)
の行で、「 count
配列に character
のキー(文字)がなかったら、 0
をセットして」
と処理しているからです。
"t" の動作
では、 "t" はどうなってるでしょう?
python
1message='It was a bright cold day in April, and the clocks were striking thirteen.' 2# now! ^ 3 4# 0 +1 5 count["t"]=count["t"] +1
これも1加算されます。
続けて" "の文字
python
1message='It was a bright cold day in April, and the clocks were striking thirteen.' 2# now! ^ 3 4# 0 +1 5 count[" "]=count[" "] +1
これも、まずは1加算されます。
これ以上書くときっとうんざりしてしまうと思うので、このへんで。
更に同じ文字があれば、もちろん以下のようになります。
python
1message='It was a bright cold day in April, and the clocks were striking thirteen.' 2# now! ^ 3 4# 1 +1 5 count["a"]=count["a"] +1 6# count["a"]は2になる
という事を、一文字ずつ処理しています。
まとめ
python
1for character in message: # messageの中を一文字ずつcharacterに入れる 2 count.setdefault(character , 0) # count辞書にcharacterのキーがない場合、0を代入 3 count[character]=count[character] +1 # ここに来るときには絶対にキーがあるので、辞書の要素に1加算
という具合です。
長ったらしい説明を最後まで読んでくださり、ありがとうございます。
投稿2018/10/24 05:38
総合スコア2244
0
仮にmessageが'abaac'とすると
1文字目はa
count['a'] = 0
count['a'] = count['a'] + 1 (0 + 1 = 1)
2文字目はb
count['b'] = 0
count['b'] = count['b'] + 1 (0 + 1 = 1)
3文字目はa
count['a'] = count['a'] + 1 (1 + 1 = 2)
4文字目はa
count['a'] = count['a'] + 1 (2 + 1 = 3)
5文字目はc
count['c'] = 0
count['c'] = count['c'] + 1 (0 + 1 = 1)
結果、
count['a'] = 3
count['b'] = 1
count['c'] = 1
投稿2018/10/24 05:00
総合スコア2471
0
count[character]でその文字の出現回数が得られます。
'a'の文字が現れたとします。
aがまだ現れていない場合、
Python
1count.setdefault('a' , 0) # 'a': 0 2count['a']=count['a'] + 1 # 1 = 0 + 1
aがすでに現れている場合、
Python
1# 4回目 'a': 3 2count.setdefault('a' , 0) # 'a': 3 既に存在するので変化なし。 3count['a']=count['a'] + 1 # 4 = 3 + 1
こんな感じの処理になっています。
投稿2018/10/24 05:07
総合スコア168
0
count.setdefault(character,0) → countにcharacterがなければ「0」を返す。
count.setdefault(character,0)自身は常に0を返すわけではありません。また、コードを見れば分かる通り返り値は活用していません。
詳細な仕様はドキュメントなどで確認していただければ良いのですが、かいつまんでいえば
- 第一引数のキーが存在しなければ新しくキーを作り、第二引数のデフォルト値を代入する。返り値はデフォルト値
- 第一引数のキーが存在していれば辞書に対する変更はせず、キーの値を返す
という動作をしています。
count[character]=count[character]+1 →理解できず。。。
count[character]のカウントを+1しています。
投稿2018/10/24 05:02
総合スコア30935
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 04:22
2018/11/02 06:46
2018/11/02 07:08