🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

5回答

1096閲覧

エラーがでてきてどこに問題があるのかわかりません

malia

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/10/05 01:57

'''

テキストエディタに書いて、ターミナル(Linux)で実行しています

エラーの結果がこれでした
Traceback (most recent call last):
File "17.py", line 71, in <module>
result += one_ninteen_num[ i ]
IndexError: list index out of range

ですので一番下から2行目のコードでインデックスの範囲を超えて参照しているのが原因
だと思うのですが、プログラムを何度見直してもどこに問題があるのかわかりません。

どこに問題があるのでしょうか?

問題17「数字の文字数」
1から5までの数字を英単語で書けばone、two、three、four、fiveであり、全部で3 + 3 + 5 + 4 + 4 = 19の文字が使われている。

では1から1000(千)までの数字をすべて英単語で書けば、全部で何文字になるか。

注:空白文字やハイフンを数えないこと。例えば、342(three hundred and forty-two)は23文字、115(one hundred and fifteen)は20文字と数える。なお、「and」を使用するのは英国の慣習。

'''

python

1one_ten = ['dummy', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'] 2eleven_nineteen = ['dummy', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'] 3twenty_ninety = ['dummy', 'dummy', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'] 4hundred = ['hundred'] 5thousand =['thousand'] 6 7one_ten_num = [] 8eleven_ninteen_num = [] 9twenty_ninety_num = [] 10hundred_num = [] 11thousand_num = [] 12 13 14#文字列の長さを図る(下準備) 15#1-10 16for i in one_ten: 17 one_ten_num.append(len(i)) 18#11-19 19for i in eleven_nineteen: 20 eleven_ninteen_num.append(len(i)) 21 22#1-19 23one_ninteen_num = one_ten_num + eleven_ninteen_num 24 25#20-90..10 26for i in twenty_ninety: 27 twenty_ninety_num.append(len(i)) 28#100 29hundred_num = len(hundred) 30#1000 31thousand_num = len(thousand) 32 33#此処からメインプログラム 34 35result = 0 36standard_value = 1000 37 38 39for i in range(1, standard_value + 1 ): 40 41 if i == 1000: # 1000の場合足して終了 42 result += thousand_num 43 break 44 45 if i >= 100: # 100以上の場合 46 result += hundred_num 47 48 a = one_ninteen_num[ int( str( i )[2])] 49 result += a 50 i -= 100*(int( str( i )[2])) 51 52 if not i: # 端数がある場合 53 result += len('and') 54 55 if 0 < i < 20: # 1から19までの場合 56 result += one_ninteen_num[ i ] 57 58 elif 20 < i < 100: # 20から99までの場合 59 a = twenty_ninety_num[int( str( i )[1])] 60 result += a 61 i -= 10*(int( str( i )[1])) 62 63 if i > 1: 64 result += one_ninteen_num[ i ] 65 66print( result )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

インデックスの値は範囲外になる、ということははっきりしているので、
その実際のインデックスの値を表示させるなりしてみればどうなんでしょう。

投稿2019/10/05 02:11

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

malia

2019/10/05 02:18

その手がありましたか ありがとうございます! もう一度自分でやってみようと思います。
guest

0

elif 20 < i < 100:のブロックの中のstr( i )[1]はおそらく10の位の数値を表現したかったのだと思いますが実際は1の位になっています。str( i )[0]の間違いだと思います。

Python

1>> list(str(29)) 2['2', '9'] 3>>> str(29)[0] 4'2' 5>>> str(29)[1] 6'9'

わざわざ文字列にしなくてもint(i/10)でいい気がします。

i -= 10*(int( str( i )[1]))は元の値の20の剰余を求めたかったと思いますがそのようになっていないと思います。
i %=20 でいいと思います。

投稿2019/10/05 03:04

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ロジック追ってませんが、ぱっと見、終わりの方のif文で、`i‘が20のときどうなるんだろう?と思ってしまいます。
このレベルのミスがほかにもあるのでは?

投稿2019/10/05 02:33

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

デバッグしましょう。

File "17.py", line 71, in <module>
result += one_ninteen_num[ i ]

上記でエラーが起きているので、その行の前で変数iを確認してください。

Python

1print(i) 2result += one_ninteen_num[ i ]

投稿2019/10/05 02:17

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

文字の参照位置を間違えていました

投稿2019/10/05 03:18

malia

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問