質問するログイン新規登録
Python 3.x

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

Q&A

解決済

1回答

679閲覧

list index out of rangeのエラーについて

chibiyt

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2019/03/29 09:56

0

0

前提・実現したいこと

n×m行列を入力し、各行と列の合計を挿入した新しい表を出力するプログラムを作成しています。

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

各行と列の合計を求めて挿入する段階で下記のエラーが起きてしまいます。

IndexError Traceback (most recent call last) <ipython-input-7-67709c5dbd4f> in <module>() 16 for i in range(n): 17 for j in range(m): ---> 18 A[i][m+1] += A[i][j] 19 20 for j in range(m+1): IndexError: list index out of range

該当のソースコード

python3

1n, m = map(int, input().split()) 2 3A = [[0]*(m+1) for i in range(n+1)] 4 5for i in range(n): 6 B = list(map(int, input().split())) 7 for j in range(m): 8 A[i][j] = B[j] 9 10for i in range(n): 11 for j in range(m): 12 A[i][m+1] += A[i][j] 13 14for j in range(m+1): 15 for i in range(n): 16 A[n+1][j] += A[i][j] 17 18for i in range(n+1): 19 print(A[i][0], end='') 20 for j in range(1, m+1): 21 print(' %d'%A[i][j], end='') 22 print()

試したこと

最初の入力段階で直接行列Aに入力してしまうと行数が書き換えられてしまうとのことだったので新たに行列Bを作成し、そちらに入力してから行列Aに代入しなおす仕組みに書き換えてみたのですが、それでも行数が書き換えられてしまっているようでうまく出力が行えません。

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

python 3.6.2
ここにより詳細な情報を記載してください。

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

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

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

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

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

hayataka2049

2019/03/29 10:01 編集

3*4くらいの小さい行列の入力例、それを入力した際に期待される出力を教えてください。
guest

回答1

0

ベストアンサー

とりあえず、インデックスの番号は0から始まってn-1(n:要素数)で終わるので、サイズを縦横1つ増やしたとしてもm+1とかは取れません。mまでです(縦横1つずつ増やさなければm-1まで)。

それだけ修正したコード。

python

1n, m = map(int, input().split()) 2 3A = [[0]*(m+1) for i in range(n+1)] 4 5for i in range(n): 6 B = list(map(int, input().split())) 7 for j in range(m): 8 A[i][j] = B[j] 9 10for i in range(n): 11 for j in range(m): 12 A[i][m] += A[i][j] 13 14for j in range(m+1): 15 for i in range(n): 16 A[n][j] += A[i][j] 17 18for i in range(n+1): 19 print(A[i][0], end='') 20 for j in range(1, m): 21 print(' %d'%A[i][j], end='') 22 print() 23 24""" 25Input: 264 5 271 1 3 4 5 282 2 2 4 5 293 3 0 1 1 302 3 4 4 6 31 32Output: 331 1 3 4 5 342 2 2 4 5 353 3 0 1 1 362 3 4 4 6 378 9 9 13 17 38"""

どこがミスっているのか? とざっと見て、出力時のループでrange(1, m)というのを見つけたのでrange(1, m+1)にします。

python

1for i in range(n+1): 2 print(A[i][0], end='') 3 for j in range(1, m+1): 4 print(' %d'%A[i][j], end='') 5 print() 6 7""" 8Input: 94 5 101 1 3 4 5 112 2 2 4 5 123 3 0 1 1 132 3 4 4 6 14 15Output: 161 1 3 4 5 14 172 2 2 4 5 15 183 3 0 1 1 8 192 3 4 4 6 19 208 9 9 13 17 56 21"""

できました。これでよしとするなら良いですし、まあ私なら読みづらいのでリファクタリングします。

投稿2019/03/29 10:28

hayataka2049

総合スコア30939

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

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

chibiyt

2019/03/29 10:53

回答ありがとうございました! ものすごく初歩的なところでミスしていてお恥ずかしい限りです… もしよろしければリファクタリングの案なども教えて頂けますと幸いです。
hayataka2049

2019/03/29 10:56

とりあえず入力は先に済ませた方がわかりやすいんじゃないでしょうか。 n, m = map(int, input().split()) A = [list(map(int, input().split())) for _ in range(n)] みたいな感じに。 行方向はsumでそのままできます。列方向はzipを使ってやるいい方法があります(「python list 転置」などで検索すると出るでしょう)。
chibiyt

2019/03/29 11:31

なるほど。 確かに合計出すだけならsum使えば済む話でしたね。 とても勉強になりました! 丁寧にリファクタリングまで教えてくださりありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問