質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

2回答

5561閲覧

IndexError: list index out of rangeのエラーが修正できません(初心者です)

klinsman18

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2019/01/01 05:39

編集2019/01/01 06:54

IndexError: list index out of rangeのエラーが修正できません

python3で勉強のため大きな数字を扱うための下記のプログラム記述しました。
(2^256を計算するプログラム)、python3では、変数の型がなく、C言語でいうlonglong型以上を扱えるため、このようなプログラムを書かずに良いのですが、後学ために、このようなプログラムを書いてみました。
手順としては、C言語でまず試してみて、上手く動作をしたのを確認して、python3に移植したのですが、IndexError: list index out of rangeのエラーが出て、上手くいきません。

発生している問題・エラーメッセージ

エラーメッセージ
Traceback (most recent call last):
File "2-256_2.py", line 5, in <module>
IndexError: list assignment index out of range

a[0] = 2 の行

該当のソースコード

#1次元配列を78桁分用意して、各配列変数には1桁しか入らないようにし,2の256乗を計算する

import sys
def main():

  • a = []

  • a[0] = 2         # a[0]の初期値

  • for j in range(1,77): # a[1]~a[77]の初期値     

  • a[j] = 0
  • for i in range(255): # iが0から254繰り返す(255回)

  • for j in range(0,77): # jが0から77まで繰り返す(78回)
  • a[j] = a[j] * 2 # 各桁に2を掛ける
  • for j in range(0,77): # jが0から77まで繰り返す(78回)
  • if (a[j] >= 10): # 各桁の数値が溢れたら(10以上なら)
  • a[j+1] = a[j+1] + a[j] / 10 # 1つ上の桁に繰り上げ
  • a[j] = a[j] % 10 # 1桁目の剰余を残す
  • else:False
  • for j in range(77,0): # jが77から0まで繰り返す(78回)

  • print(a[j]) # 各桁を表示

if name == 'main': main()

試したこと

最初のa[]をa{}に変更

補足情報(FW/ツールのバージョンなど)

rasberrypi3B+を使用

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

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

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

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

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

fu7mu4

2019/01/01 05:50

pythonはインデントで制御構造を表す言語なので、インデントのないコードは読めません。 適切にインデントを付けてコードを記載してください。
klinsman18

2019/01/01 05:55

ご指摘ありがとうございます。適当にコピベでもってきただけなので、失礼いたしました。
can110

2019/01/01 06:02

どの行でエラー発生したか分からないので、エラーメッセージはTraceback全文を記載ください。
退会済みユーザー

退会済みユーザー

2019/01/01 06:29

コード構文をりかいしないってことは パイソンのドキュメントもまともに読んでないんでしょうね
klinsman18

2019/01/01 06:53

can110様 ご指摘ありがとうございます。 本文のエラーコードを編集いたしました。
can110

2019/01/01 06:57

asahina1979さん、ここは質問への追記・修正などを依頼する欄であり 単なる感想などを呟く場ではないことをごりかいください。 なお、teratailの基本的な使い方がhttps://teratail.com/helpに記載しているので一読ください。
guest

回答2

0

ベストアンサー

理由はシンプルで、存在しない要素にアクセスしようとしているからです。

Python

1>>> a = [] 2>>> a[0] 3Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5IndexError: list index out of range

要素を加えたい場合は、list.appendを使ってください。

Python

1>>> a.append(1) 2>>> a 3[1]

あるいは必要な長さを持ったリストを前以て作っておいても良いです。

Python

1>>> a = [0] * 10 2>>> a[0] = 42 3>>> a 4[42, 0, 0, 0, 0, 0, 0, 0, 0, 0]

コーディングの方針

独立した機能を分割していくのが、バグを減らすコツです。
今回の場合、二倍する関数を用意しておくと使いやすいかと。

Python

1>>> def double_digit(d): 2... return divmod(d * 2, 10) 3... 4>>> double_digit(9) 5(1, 8)

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
Python
特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2019/01/01 06:09

編集2019/01/01 06:26
LouiS0616

総合スコア35660

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

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

klinsman18

2019/01/01 07:08

たいへん、勉強になりました。特に3つ目の枠の回答が自分には分かり易かったです。その他、丁寧な知識の解説、どうもありがとうございました。pythonはまだ、始めたばかりなのですが、こらからも続けて行きたいと思っております。
guest

0

index out of range のエラー理由は他の回答にある通りです。

ここでは、質問文のコードを書き換えて 2のべき乗 (1 から 255) を求めてみました。

pow.py

python3

1def show(a): 2 # 逆順にして各桁を表示 3 print("".join([str(x) for x in (reversed(a))])) 4 5def multi(a, n): 6 k = 0 # 繰り上がり 7 for i in range(len(a)): 8 a[i] = a[i] * n + k 9 k = a[i] // 10 10 a[i] %= 10 11 12def main(): 13 keta = 78 14 15 for p in range(256): 16 a = [1] + [0] * (keta - 1) # a の初期値 1 17 for i in range(p): 18 multi(a, 2) 19 show(a) 20 21if __name__ == '__main__': 22 main()

実行例
イメージ説明
... 省略 ...
イメージ説明

投稿2019/01/03 07:56

katoy

総合スコア22324

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

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

klinsman18

2019/01/05 08:09

いろいろな手法を教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問