前回の初期化編では、リストをどう作るのかにフォーカスを当てて、リストの初期化方法を網羅的に解説しました。
リストを初期化した後の、要素へのアクセスや変更方法について見ていきましょう。
ここでは次の疑問を解決します。
- リスト内の要素にどうやってアクセスするの?
- リストの要素を変更したい
- 指定した箇所に要素を追加したい
- リストの要素を削除したい
目次
リスト(list)の参照・更新
初めに初期化済みのリストの要素への参照・更新方法を見ていきましょう。
要素の参照
リストの要素を参照するためには「インデックス番号(オフセット)」を使います。
インデックス番号とは、作成されたリストの要素1つ1つに自動的に付与される番号のことで、左から順に0, 1, 2, 3…と「0から始まる」連番になっているのが特徴です。
インデックス番号を使ってリストの要素を参照する書式は次の通りです。
書式list[インデックス番号]
では実際にリストの要素にアクセスしてみましょう。
mixes = [3, "こんにちは", True, 0.314]hello = mixes[1]print(hello)
結果こんにちは
リストの2番目の要素にアクセスし、結果をhello変数に入れて表示しています。
インデックス番号は左から順に0, 1, 2…と割り振られているので、2番目の要素のインデックス番号は「1」です。
ちなみに、実はインデックス番号は末尾からも割り振られており、-1, -2, -3…と「マイナスの連番」が設定されています。
mixes = [3, "こんにちは", True, 0.314]boolean = mixes[-2]print(boolean)
結果True
-2は「後ろから2番目の要素」を指しているので「True」を参照しました。
多次元リストの要素へのアクセス
次に多次元リストの要素へのアクセス方法を見ていきましょう。
多次元リストの場合はインデックス番号を複数指定することで、ネストした要素を参照できます。
numbers_2 = [ [1, 2, 3] ,[4, 5, 6] #←このリストにアクセス ,[7, 8, 9]]numbers_3 = [ [ [1, 2] ,[3, 4] ,[5, 6] ] ,[ [7, 8] ,[9, 10] ,[11, 12] #←このリストにアクセス ]]print(numbers_2[1][2]) #2番目のリストの3番目の要素を参照print(numbers_3[1][2][1]) #2番目のリストの3番目のリストの2番目の要素を参照
結果612
for..inを使って全要素にアクセスする
次はfor..inを使ってリスト内の全ての要素にアクセスしてみましょう。
リストを使ったfor..inの書式は次の通りです。
書式for 要素名 in リスト:
では実際にfor..inを使ってリストの全要素を参照してみましょう。
mixes = [3, "こんにちは", True, 0.314]for mix in mixes:print(mix)
結果3こんにちはTrue0.314
また、多次元リストの場合はfor..inをネストすることで全要素を参照できます。
numbers = [ [1, 2, 3] ,[4, 5, 6] ,[7, 8, 9]]for number_line in numbers: for number in number_line: print(number, end = ", ")
結果1, 2, 3, 4, 5, 6, 7, 8, 9,
要素の更新
要素の更新は参照と同じくインデックス番号を使えば簡単にできます。
書式list[インデックス番号] = 値
指定したインデックス番号の要素に、変数に値を入れるのと同じようにするだけです。
mixes = [3, "こんにちは", True, 0.314]print(mixes)mixes[2] = Falseprint(mixes)
結果[3, 'こんにちは', True, 0.314][3, 'こんにちは', False, 0.314]
Tips.リストのインデックスエラーを回避するには?
リストを使うとほぼ必ずといって良いほど遭遇するエラーが「IndexError」です。
IndexErrorはリストに存在しないインデックス番号で要素を参照しようとしたときに起こるエラーです。
例えば3つの要素を持ったリストに「3」のインデックス番号を指定した場合、4番目の要素が存在しないのでIndexErrorになります。
numbers = ["a", "b", "c"]print(numbers[3])
結果IndexError: list index out of range
IndexErrorを回避するには、リストの長さをlen()で調べるのが効果的。len()は引数にリストを渡すことで、そのリストの長さを返してくれる関数です。
これを使うと先ほどの例を次のように直すことができます。
numbers = ["a", "b", "c"]idx = 3if (idx <= len(numbers) - 1): print(numbers[idx])else: print(numbers[len(numbers) - 1])
結果c
上のプログラムは「idxがリストの長さ – 1以下の場合はそのままリストを参照し、大きければリストの最後の要素を参照」しています。
リストの長さ – 1という計算が必要なのは、len()で取得できる長さは0からではなく1から数えるので、インデックス番号と比較演算する場合は – 1して合わせる必要があるからです。
インデックス番号を指定する[]内で計算式を記述することもできます。最後の行は「len()で取得した長さ – 1」で、numbersリストの最後の要素のインデックス番号を計算しています。
リスト(list)に要素を追加する
ここからはリストに要素を追加する方法を見ていきましょう。
要素を追加する方法は「append()を使ってリストの末尾に要素を追加する」パターンと「insert()で指定箇所に要素を挿入する」方法があります。
append()を使って要素を追加する
まずはappend()で要素を追加する方法を見ていましょう。
append()はリストの末尾に要素を追加するメソッドで、引数も一つしかなくシンプルに扱えます。
書式リスト.append(要素)
では要素を追加してみましょう。追加する要素はリストの要素として扱えるものなら何を入れても問題ありません。
list = []list.append(10)list.append(True)list.append(["a", "b"])print(list)
結果[10, True, ['a', 'b']]
insert()を使って要素を指定箇所に挿入する
次にinsert()の使い方を見ていきましょう。
insert()には引数が二つあり、インデックス番号で挿入する箇所を指定することができます。
書式リスト.insert(挿入位置, 値)
ではinsert()を使ってみましょう。指定した挿入位置に第二引数の値が入り、後に続く要素は一つずつ後ろにずれます。
list = ["a", "b", "d", "e", "f"]list.insert(2, "c")print(list)
結果['a', 'b', 'c', 'd', 'e', 'f']
挿入位置に2を指定したので、インデックス番号2の場所にcが挿入されました。
d, e, fは一つずつ後ろにずれているのがわかります。
リスト(list)の要素を削除する
最後にリストの要素を削除する方法を見ていきましょう。
リストの要素を削除する方法は、要素を抜き出すpop()を使うパターンと、特定の値を指定して削除するremove()を使うパターンがあります。
pop()を使って要素を抜き出す
まずはpop()の使い方を見ていきましょう。pop()はリスト内の要素を抜き出します。
削除ではなく、「要素を抜き出す」と書いているのは、pop()は末尾にある要素を削除した後、その要素を返却するメソッドだからです。
実際にpop()を使って見ましょう。書式は次の通りです。
書式リスト.pop(抜き出す位置)
抜き出す位置にはインデックス番号を指定します。この引数は省略することもでき、その場合は末尾の要素を抜き出します。
list = ["a", "b", "d", "e", "f"]alpha_f = list.pop()alpha_b = list.pop(1)print(alpha_f)print(alpha_b)print(list)
結果fb['a', 'd', 'e']
最初のpop()は引数を指定していないので末尾のfを取得し、2番目のpop()は「1」を指定しているので、2番目の要素であるbを取得しました。
最後にリストを出力しています。pop()で抜き出したbとfが無くなって、要素が3つだけになっているのが分かります。
pop()を使う上での注意点として、空のリストに対してpop()した場合「indexError」となることです。
これを回避するためには、リストに要素が入っていることを確認してからpop()する必要があります。
そのために使えるのがifです。次のコードのように「if リスト」とすることで、空のリストの場合はfalseを返してくれます。
list = []if list:list.pop()
remove()を使って値から要素を削除する
次はremove()を使った方法を見ていきましょう。remove()は指定した値と同じ値の要素を削除します。
また複数同じ要素がある場合は、最初に見つけた要素が削除されます。
書式リスト.remove(削除する値)
気をつける点は、削除する値がリストに無かった場合エラーになってしまうことです。
remove()を使うときは、確実にリスト内に削除する要素が入っている場合を除き、in演算子を使って「リスト内に要素が入っているか確認してから使う」ようにすると安心です。
list = ["abc", "def", "ghi"]target = "def"if target in list:list.remove(target)print(list)
結果['abc', 'ghi']