LoginSignup
46_6_7
@46_6_7

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

for文で円周率の小数部分 (第千位まで) に表れる回数をそれぞれ求め出力するプログラムを作成

Q&AClosed

解決したいこと

num_dict.get(number, 0) + 1とする理由を教えて頂きたいです。
+1が無いと出力される文字は0となるので+1が必要だと思うのですが、
+1を付け加えるだけで何故こうも答えが変わるのかわからないので教えて頂きたいです。
また、最後のprint文についてもお尋ねしたいです。

問題

0 から 9 までの数について、円周率の小数部分 (第千位まで) に
表れる回数をそれぞれ求め出力するプログラムを作成してください。
なお、答えは 0 の場合から順に改行区切りで出力してください。

該当するソースコード

PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989'

num_dict = dict()
for number in PI[2:]: 
    num_dict[number] = num_dict.get(number, 0) + 1

for number in range(10):
    print(num_dict.get(str(number), 0))

上記コードを基にした自分の考え

PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989'

num_dict = dict()
for number in PI[2:]: 
    num_dict[number] = num_dict.get(number, 0) + 1

for number in range(10):
    print(num_dict.get(str(number), 0))

#num_dict = dict() ここで辞書の定義をする。

#PI[2:]で少数部分のカウント。

#num_dict[number] = num_dict.get(number, 0) + 1
   #意味がわからない。

#for number in range(10): 0~9まで順に表示。

#print(num_dict.get(str(number), 0))
   #numberにkeyが入る?この場合0~9?
   #該当する物がなければ0が表示される。


0

2Answer

既に回答者が居られますが……
質問者さんが最初に挙げられたコードでは、num_dictは最初に空の辞書として生成され、その後「もし対応するキーの値が存在しなければ」を考慮した処理を用いて、加算・表示を行うようになっています。num_dict = dict()とすると、最初はどのキーも存在しないので、どのキーの値をnum_dict[number]で参照しようとしてもKeyErrorになります。.getは、その対策に使うことができるメソッドです。num_dict.get(number, 0)は、「もしnum_dict[number]があればそれを返し、無ければ0を返す」というものです。これでKeyErrorを回避しています。

この辺りを考慮し、「もし対応するキーの値が存在しなければ」を回避すれば、もう少しその辺りがシンプルなコードにすることができます。

// PI=...
num_dict = {
  '0': 0,
  '1': 0,
  '2': 0,
  '3': 0,
  '4': 0,
  '5': 0,
  '6': 0,
  '7': 0,
  '8': 0,
  '9': 0
}// ちなみにここはループを用いて生成させることができます
for number in PI[2:]: 
    num_dict[number] += 1

for number in range(10):
    print(num_dict[str(number)])
2

Comments

  1. わかりやすい解説ありがとうございます!
    その他の方法としては「defaultdict」でも行けますね。
    初期化が必要なく地味に便利です!


    from collections import defaultdict

    d = defaultdict(int)

    for number in PI[2:]:
      d[number] += 1

    for number in range(10):
      print(d[str(number)])

結論から言うと、+1をすることで各数字の出現回数をカウントしています。

for number in PI[2:]: 
    num_dict[number] = num_dict.get(number, 0) + 1

上記コード部分の解説です。


for number in PI[2:]: 

まず、numberという変数にPIの3文字目以降(円周率の小数部分)が1文字ずつ入ってループしています。


num_dict[number] = num_dict.get(number, 0) + 1

14159265...

numberが最初の1の場合、num_dict.get(number, 0)で0が返り+1されて
Key[1]に1が格納されます。

14159265...
    ↑
numberが2回目の1の場合、num_dict.get(number, 0)で1が返り+1されて
Key[1]に2が格納されます。

このような流れで、各数字の出現回数をカウントしています。


余談ですが、pythonのコードをデバッグ実行できる環境があればステップ実行で変数の値の変化を追ってみたり、それが難しければループごとにprintして現在の変数の値を出力して確認してみたりすることで、ソースの理解・デバッグ力の向上につながると思います。
ぜひ活用してみてください!

0

Comments

  1. @46_6_7

    Questioner
    申し訳ございませんが、最初の1の場合、なぜ0が返るのかわからないです。
    14159265...

    numberが最初の1の場合、num_dict.get(number, 0)で0が返り+1されて
    Key[1]に1が格納されます。

    それ以外は理解できたかと思います。
    ありがとうございます。

Your answer might help someone💌