[Python]list index out of rangeの原因とその対処方法|ソースコードを交えて詳しく解説!
- システム
エンジニア - list index out of rangeの対処方法を教えてください。
- プロジェクト
マネージャー - list index out of rangeの対処方法を原因も合わせて紹介します。
[Python]list index out of rangeの原因とその対処方法
今回は、Pythonでの「list index out of range」の原因とその対策について紹介します。
listに対して範囲外のインデックスにアクセスすると、「list index out of range」例外が発生します。その対処方法について、ソースコードを交えて紹介します。
興味のある方はぜひご覧ください。
原因
「list index out of range」を発生させてみます。実際のソースコードを見てみましょう。
1
2
3
|
mylist = ['item1', 'item2', 'item3', 'item4', 'item5']
print(mylist[10])
|
実行結果は以下のようになります。
1
2
3
4
|
Traceback (most recent call last):
File "Main.py", line 3, in <module>
print(mylist[10])
IndexError: list index out of range
|
範囲外にアクセスしているので、IndexErrorが発生します。
以下のようなコーディングミスも良くあります。
1
2
3
|
mylist = ['item1', 'item2', 'item3', 'item4', 'item5']
print(mylist[len(mylist)])
|
実行結果は以下のようになります。配列の最終要素はmylist[len(mylist)]ではなくmylist[len(mylist)-1]なので、IndexErrorが発生します。
1
2
3
4
|
Traceback (most recent call last):
File "Main.py", line 3, in <module>
print(mylist[len(mylist)])
IndexError: list index out of range
|
対処
「list index out of range」の対処方法を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
mylist = ['item1', 'item2', 'item3', 'item4', 'item5']
# for文で繰り返し処理
for index in range(0, len(mylist)):
print(mylist[index])
# for文で繰り返し処理
for i in mylist:
print(i)
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
|
item1
item2
item3
item4
item5
item1
item2
item3
item4
item5
|
rangeを使ったり、for inでアクセスすることで、IndexErrorが発生しません。
配列の結合
「list index out of range」の事例を紹介します。配列を結合したいケースです。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
def addlist(x, y):
for i in y:
x.append(y[i])
return x
mylist1 = [1, 2, 3, 4, 5]
mylist2 = [6, 7, 8, 9, 10]
print(addlist(mylist1, mylist2))
|
実行結果は以下のようになります。appendでIndexErrorが発生します。append(y[i])と記述すると、y[6]、y[7]…となります。そのため、IndexErrorとなります。
1
2
3
4
5
6
|
Traceback (most recent call last):
File "Main.py", line 9, in <module>
print(addlist(mylist1, mylist2))
File "Main.py", line 3, in addlist
x.append(y[i])
IndexError: list index out of range
|
この場合、以下のように対処します。
1
2
3
4
5
6
7
8
9
10
|
def addlist(x, y):
for i in y:
# x.append(y[i]) # これはIndexError
x.append(i)
return x
mylist1 = [1, 2, 3, 4, 5]
mylist2 = [6, 7, 8, 9, 10]
print(addlist(mylist1, mylist2))
|
実行結果は以下のようになります。間違えやすいので注意してください。
1
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
無視
「list index out of range」を無視する方法を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
|
# サイズがバラバラな2次元配列
mylist = [[11, 12, 13, 14], [21, 22], [31, 32, 33, 34, 35], [41]]
for i in mylist:
# 3つめの要素を表示
print(i[2])
|
実行結果は以下のようになります。3つめの要素がないものもあるので、IndexErrorが発生します。
1
2
3
4
|
Traceback (most recent call last):
File "Main.py", line 3, in <module>
print(i[2])
IndexError: list index out of range
|
この場合、以下のように対処します。
1
2
3
4
5
|
mylist = [[11, 12, 13, 14], [21, 22], [31, 32, 33, 34, 35], [41]]
for i in mylist:
# lengthが3以上ならば
if len(i)>=3:
print(i[2])
|
実行結果は以下のようになります。
1
2
|
13
33
|
lengthを確認して表示しています。
以下のような対処方法もあります。空タプルか否かをチェックしています。
1
2
3
4
5
|
mylist = [[11, 12, 13, 14], [21, 22], [31, 32, 33, 34, 35], [41]]
for i in mylist:
# 空タプルでなければ
if i[2:]:
print(i[2])
|
実行結果は以下のようになります。
1
2
|
13
33
|
例外処理を利用する方法もあります。
1
2
3
4
5
6
7
|
mylist = [[11, 12, 13, 14], [21, 22], [31, 32, 33, 34, 35], [41]]
for i in mylist:
# 例外処理
try:
print(i[2])
except IndexError:
print('no item')
|
実行結果は以下のようになります。
1
2
3
4
|
13
no item
33
no item
|
配列を辞書に格納
2次元配列を辞書に格納する方法を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
result = []
# サイズがバラバラな2次元配列
mylist = [['ichiro', 12, 'ichiro@email.com'], ['jiro', 22], ['saburo'], [], ['goro', 24, 'goro@email.com']]
# 2二元配列の繰り返し処理
for i in mylist:
# lengthを確認してどちらを使用するか決める
result.append({
'name': i[0] if len(i) > 0 else '',
'age': i[1] if len(i) > 1 else '',
'email': i[2] if len(i) > 2 else ''
})
# 結果表示
print(result)
|
実行結果は以下のようになります。
1
|
[{'name': 'ichiro', 'age': 12, 'email': 'ichiro@email.com'}, {'name': 'jiro', 'age': 22, 'email': ''}, {'name': 'saburo', 'age': '', 'email': ''}, {'name': '', 'age': '', 'email': ''}, {'name': 'goro', 'age': 24, 'email': 'goro@email.com'}
|
要素が存在しない場合は、空文字が格納されることが分かります。
- システム
エンジニア - Pythonでのlist index out of rangeの原因と対処方法がわかりました。
- プロジェクト
マネージャー - これを参考に理解を深め、実際にコードを書いてマスターしましょう。
まとめ
いかがでしたでしょうか。Pythonでの「list index out of range」の原因とその対策について紹介しました。
意図せず「list index out of range」に遭遇することはよくあります。デバッグして原因を突き止めることは、最初は困難かもしれませんが、徐々に慣れていくでしょう。
ぜひご自身でソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)