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

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

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

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

Q&A

解決済

2回答

379閲覧

各種のインデックス値を自動的に用意

Phenomenon2

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2019/06/11 16:00

前提・実現したいこと

六行目のコードが何故tvではなくtv[i]なのかを知りたい
サンプルコードを模写している最中に六行目のコードは何故tvではなくtv[i]なのか疑問に思いました。print()の引数に用いるならインデックス変数ではないと考えました。しかし実行してみたところエラーが出て進まなくなり必要だという事は分かりましたが理屈が呑み込めません。コメントは勝手に自分で書き足したものです。

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

IndexError Traceback (most recent call last) <ipython-input-3-cc6870486a21> in <module> 2 3 for i, new in enumerate(tv): #iはtvリストの位置、newはtvリストの名前。それぞれをenumerate関数で代入 ----> 4 new = tv[i] #iはtvリストの全ての位置情報を持っていてnewにそれぞれ代入 5 new = new.upper() #new(tvのリストの中身)を全部大文字化するメソッドを使いnewに再代入 6 tv = new # IndexError: string index out of range

該当のソースコード

tv = ["GOT", "Narcos", "Vice"] for i, new in enumerate(tv): #iはtvリストの位置、newはtvリストの名前。それぞれをenumerate関数で代入 new = tv[i] #iはtvリストの全ての位置情報を持っていてnewにそれぞれ代入 new = new.upper() #new(tvのリストの中身)を全部大文字化するメソッドを使いnewに再代入 tv = new # print(tv)

試したこと

六行目のtv[i]から[i]の削除

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

Jupyter notebook
Anaconda

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

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

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

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

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

guest

回答2

0

ベストアンサー

リストのアクセスについて

レベルがわからないのでかなり細かく説明します。
冗長でしたらすいません。

まず確認ですが、正しいのは下のコードで間違いないでしょうか?

Python

1tv = ["GOT", "Narcos", "Vice"] 2 3for i, new in enumerate(tv): 4 new = tv[i] 5 new = new.upper() 6 tv[i] = new # 修正箇所

tvはリスト型で、中身はstr型です。
リスト型はtv[0]というように番号を指定すると、その番号にアクセスできます。

「中身を変更したい」という時は中身にアクセスするので、番号を指定してやる必要があります。

Python

1# 例 2tv[0] = "Test" 3print(tv[0]) 4# -> : Test

番号を指定しないでtvに代入してしまうと、リストそのものが文字列になってしまいます。

Python

1tv = ["Tes", "test"] # ここではtvはリスト型 2tv = "example" # tvはstr型になる

forの中身について

enumerate関数は、番号と中身を順番に、いっしょに返してくれる関数です。
該当コードのiには番号、newにはリストのi番目の文字列が入っています。

Python

1for i, new in enumerate(tv): 2 # i : 番号が入ってる 3 # new : tv[i]の中身が入ってる

今回変更したいのは、tvの中身なので

Python

1tv[i] = new # newはstr(文字列)、newをtv[i]に代入する

とする必要があります。

Python

1tv = new

と書くと、「リスト自体を文字列にする」ことになるので、2週目のforループでエラーになります。

投稿2019/06/11 17:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

コードの内容とエラーの原因

ループでは次の1~3の処理が行われています。

  1. リスト tvi 番目の要素を tv[i] で取得し、変数 new に代入する。
  2. new = new.upper() で大文字にする。
  3. tv[i] = new でリスト tv の i 番目の要素に大文字にした new を代入する。

もし、3番目を tv = new としてしまうと、リストであったはずの tv が上書きされてしまい、次のループで1に戻って来た時点で tv がリストではなく、先程の new の値になってしまっているので、エラーとなります。

リストの各文字を大文字にするコード

先程のコードを簡略化すると以下のようになります。

python

1tv = ["GOT", "Narcos", "Vice"] 2 3for i in range(len(tv)): 4 # i 番目の要素を大文字にする。 5 tv[i] = tv[i].upper() 6 7print(tv) # ['GOT', 'NARCOS', 'VICE']

内包記法でやると以下

python

1tv = ["GOT", "Narcos", "Vice"] 2 3# すべての要素を大文字にする。 4tv = [x.upper() for x in tv] 5print(tv) # ['GOT', 'NARCOS', 'VICE']

投稿2019/06/11 16:09

編集2019/06/11 16:17
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問