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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3731閲覧

インデックス0に対してlist index out of rangeのエラーが起きる

omugi

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/21 09:03

編集2020/09/21 09:08

前提・実現したいこと

txtファイルを読み込んで辞書型に格納する関数です。

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

要素[0]で範囲外とエラーが出ました。

IndexError Traceback (most recent call last) <ipython-input-30-8f3a925c59a3> in <module> 24 25 #トレーニングデータのキャプションと画像名を紐付ける ---> 26 train_imagecaptions_dict = make_imagecaptions_dictionary('caption_mold.txt', train) 27 #バリデーションデータのキャプションと画像名を紐付ける 28 val_imagecaptions_dict = make_imagecaptions_dictionary('caption_mold.txt', val) <ipython-input-30-8f3a925c59a3> in make_imagecaptions_dictionary(filename, setname) 10 word = line.split() 11 #最初の単語を画像名、残り全てをキャプションとして読み込む ---> 12 image_id = word[0] 13 image_sentence = word[1:] 14 #画像名がデータセット中に含まれていれば以下を実行 IndexError: list index out of range

該当のソースコード

#画像名とキャプションを紐付けたディクショナリを作成する関数 def make_imagecaptions_dictionary(filename,setname):#引数datasetはtrainとかvalとか text = load_file(filename) #辞書型作成 imagecaptions = {} #1行ずつ取り出してループ word = [] for line in text.split('\n'): #空白で区切る word = line.split() #最初の単語を画像名、残り全てをキャプションとして読み込む image_id = word[0] image_sentence = word[1:] #画像名がセット中に含まれていれば以下を実行 if image_id in setname: #その画像名をkeyにリストを作成 #その画像名が一つ目ならリストを作成 if image_id not in imagecaptions: imagecaptions[image_id] = list() #キャプションを開始語と終了語で囲む image_sentence = 'startseq ' + ' '.join(image_sentence) + ' endseq' imagecaptions[image_id].append(image_sentence) #ディクショナリに格納 return imagecaptions #トレーニングデータのキャプションと画像名を紐付ける train_imagecaptions_dict = make_imagecaptions_dictionary('caption_mold.txt', train) #バリデーションデータのキャプションと画像名を紐付ける val_imagecaptions_dict = make_imagecaptions_dictionary('caption_mold.txt', val)

試したこと

word[0]をprintで表示すると、値は正常に格納されていました。
printしたword0の要素です。

COCO_train2014_000000000009
COCO_train2014_000000000009
COCO_train2014_000000000009
COCO_train2014_000000000009
COCO_train2014_000000000009
COCO_train2014_000000000025
COCO_train2014_000000000025
COCO_train2014_000000000025
COCO_train2014_000000000025
COCO_train2014_000000000025
COCO_train2014_000000000030

引数のファイルは約60万行(約62KB)あり、このファイルの上から数行を取り出したテスト用ファイルではエラーが起きなかったので、エラーはファイルのサイズと関係があるのでしょうか。

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

引数のcaption_mold.txtの中身(一部)です。

COCO_train2014_000000000009 パン と 野菜 と 肉 と 果物 と クッキー の 弁当
COCO_train2014_000000000009 黄色い ケース の 中 に は ブロッコリー が 入っ て いる
COCO_train2014_000000000009 弁当 箱 に 料理 が 盛り付け られ て いる
COCO_train2014_000000000009 お 弁当 箱 の 中 に ハンバーグ と ブロッコリー と チーズ の つい た パン と ナッツ と フルーツ が ある
COCO_train2014_000000000009 カラフル なお 弁当 箱 に 詰め られ た おかず
COCO_train2014_000000000025 木の葉 を 食べ て いる キリン が いる
COCO_train2014_000000000025 1 頭 の キリン が 高い 木 の 草 を 食べ て いる
COCO_train2014_000000000025 キリン が 木 の 上 の 葉 を 食べ て いる
COCO_train2014_000000000025 木 の 枝 に かけ られ た エサ を 食べる キリン
COCO_train2014_000000000025 キリン が 木 に 乗せ られ た 餌 を 食べ て いる
COCO_train2014_000000000030 白い 花瓶 に 白 や 赤色 の 花 が 飾っ て ある
COCO_train2014_000000000030 バルコニー の 上 に は 沢山 の 花 が 入っ た 花瓶 が 置い て ある
COCO_train2014_000000000030 白い 花瓶 に 赤 と 白 の 花 が 入っ て いる
COCO_train2014_000000000030 白 の 陶器 の 花瓶 に 色とりどり の 花 が 活け て ある
COCO_train2014_000000000030 白い 花瓶 に 、 白 や 赤 の 花 が いけ られ て いる

引数のtrainの中身(一部)です。

{'COCO_train2014_000000180055', 'COCO_train2014_000000525932', 'COCO_train2014_000000433084', 'COCO_train2014_000000449780', 'COCO_train2014_000000150877', 'COCO_train2014_000000099628', 'COCO_train2014_000000437660', 'COCO_train2014_000000220834', 'COCO_train2014_000000343009'...}

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

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

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

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

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

guest

回答2

0

ベストアンサー

textのどこかに空行があると、IndexError: list index out of rangeが発生します。

以下のように修正してください。空行があってwordが空になっても、次の行の処理に移るのでエラーは起きません。

Python

1for line in text.split('\n'): 2 word = line.split() 3 if not word: 4 continue 5 image_id = word[0] 6 (以下略)

投稿2020/09/21 10:01

Daregada

総合スコア11990

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

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

omugi

2020/09/21 13:05

知りませんでした。勉強になります。 確かに、ファイルの最後が空行になっていました。 改善することができました。ありがとうございました。
otn

2020/09/21 13:58

> 知りませんでした。勉強になります。 splitの動作をよく知らずに使ったと言うことだと思います。 知らない関数を使うなとは言いませんが、期待通りの動作をしないときには、よく知らずに使った関数の使い方を疑いましょう。
guest

0

リストのナカミが空の場合は、インデックス0でもオーバーしますね

投稿2020/09/21 09:06

y_waiwai

総合スコア87719

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

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

omugi

2020/09/21 09:12

print関数では中身が表示されていたのですが、それでも空ということがあるのでしょうか。
y_waiwai

2020/09/21 09:15

ホンマにそれで表示されてるなら、空ではないということですが、現実にそのエラーが出ているというのは空ということですね。 さて、どっちが間違ってるんでしょうか
omugi

2020/09/21 09:21

引数のファイルの、上から数行をコピペして作成した新規ファイル(サイズを小さくした)ではエラーは起きませんでした。 ファイルの大きさが関係している可能性は考えられますか?
y_waiwai

2020/09/21 09:23

実際に動かした場合に、そのエラーが起きる箇所で実行を止め、ナカミを確認してみたらどうでしょう。 別コードにしたり実行環境を変えたりしたら状態変わるのは当たり前ですよ
omugi

2020/09/21 13:06

改善できました。助言ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問