Q1nums = [10, 20, 30] に対して nums.append([40, 50]) を実行した後の nums の中身はどれですか?
リスト型 (list) の使い方
Python のリスト型 list を基礎から解説します。宣言・インデックス・スライスから append / sort などの主要メソッドの使い方まで、一通り図解で押さえます。
リストを作る
リスト (list) を用いると、複数の値をまとめて入れられます。変数に 1 つしか値を入れられない int や str とは違い、リストはいくつでも値を並べて保持できます。
宣言は [ と ] で囲み、値をカンマ区切りで書きます。
文字列と同じように、0 始まりのインデックスで取り出します。[0] で先頭、[-1] で末尾を指定できます。
中の値は後から書き換えられるのもリストの特徴です。
# リストの宣言
numbers = [10, 20, 30, 40]
# 空リスト(あとで追加する想定)
empty = []
# 取り出し
print(numbers[0]) # 10
print(numbers[-1]) # 40
# 書き換え
numbers[1] = 99
print(numbers) # [10, 99, 30, 40]
# 違う型を混ぜて入れてもよい
mixed = [1, "apple", 3.14, True]
print(mixed[1]) # apple
多重リスト(リストの中にリスト)
[[1, 2], [3, 4]] のように、リストの中にリストを入れることもできます。取り出すときは data[1][0] のようにインデックスを 2 段で指定します。表形式のデータを扱うときに便利ですが、最初のうちは 1 重のリストだけで十分です。
スライスで切り出す
リストでも文字列と同じスライス記法が使えます。[開始:終了] で部分リストを、[::ステップ] で飛ばし取りを、[-n:] で末尾 n 個を取り出せます。
スライス結果はリストです。
[:3] は先頭から 3 つ(終了を含まない半開区間)、[-2:] は末尾 2 つ。
文字列のスライスとまったく同じ考え方で動きます。
nums = [1, 2, 3, 4, 5]
print(nums[:3]) # [1, 2, 3]
print(nums[2:]) # [3, 4, 5]
print(nums[-2:]) # [4, 5]
print(nums[::2]) # [1, 3, 5](1 つおき)
# 元のリストは変わらない(新しいリストが返る)
print(nums) # [1, 2, 3, 4, 5]
要素を追加・削除する
リストには中身を増やしたり減らしたりするメソッドが豊富に用意されています。これらのメソッドは、リスト自体を書き換えます。つまり list.append(...) を呼ぶと、list の中身が直接変わります。
| メソッド | 役割 |
|---|---|
| append(x) | 末尾に 1 つ追加 |
| extend(iterable) | 別のリストの中身を全部末尾に追加 |
| insert(i, x) | 位置 i に x を差し込む |
| remove(x) | 値 x を左から探して最初の 1 つを削除 |
| pop(i) | 位置 i の要素を取り出して返す(省略時は末尾) |
| clear() | 全部削除して空にする |
append は「1 つの要素」として追加。
extend は「中身をばらして追加」。
渡すのが同じ [4, 5] でも結果が変わります。
box = [1, 2, 3]
# 追加
box.append("apple") # 末尾に 1 つ
print(box) # [1, 2, 3, 'apple']
box.extend(["banana", "grape"]) # 中身をばらして末尾に
print(box) # [1, 2, 3, 'apple', 'banana', 'grape']
box.insert(1, "NEW") # 位置 1 に差し込み
print(box) # [1, 'NEW', 2, 3, 'apple', 'banana', 'grape']
# 削除
box.remove("apple") # 値指定で最初の一致を削除
print(box) # [1, 'NEW', 2, 3, 'banana', 'grape']
v = box.pop(0) # 位置 0 を取り出して返す
print(v) # 1
print(box) # ['NEW', 2, 3, 'banana', 'grape']
無いものを remove / pop するとエラー
remove(x) は x がリストに無いと ValueError、pop(i) は 位置 i が範囲外だと IndexError になります。消す前に if x in box: のように含まれているかをチェックしておくと安全です。
並び替え・検索(sort / reverse / count / index)
リストには並び替えや検索のメソッドも用意されています。ここで大事なのが、メソッドが 2 種類あること。
- 中身を書き換えるメソッド(sort / reverse) → 結果を受け取らず、リスト自体を直接変える
- 結果を返すだけのメソッド(count / index) → print(list.count(...)) のように戻り値を使う
sort / reverse: リスト自体を直接書き換える。受け取らない。
count / index: リストは触らず、結果を返す。受け取って使う。
fruits = ["banana", "lemon", "apple", "grape"]
# ① 書き換える系:呼ぶだけでリスト自体が変わる
fruits.sort()
print(fruits) # ['apple', 'banana', 'grape', 'lemon']
fruits.reverse()
print(fruits) # ['lemon', 'grape', 'banana', 'apple']
# ② 結果を返す系:戻り値を受け取って使う
nums = [1, 2, 2, 3, 2, 4]
print(nums.count(2)) # 3(2 が 3 つある)
print(nums.index(3)) # 3(3 は 4 番目 = index 3)
print(fruits.sort()) で None が出る理由
よくあるミスが print(fruits.sort()) と書いて None が表示されるパターン。sort() は戻り値を返さず、fruits を直接並び替えます。
先に fruits.sort() を単独で書き、そのあとで print(fruits) の 2 行に分けるのが正解です。
なお、戻り値(メソッドや関数が返してくる値)の仕組みの詳細は、関数やオブジェクト指向の記事で解説します。ここでは「sort / reverse は呼ぶだけで中身が変わる」「count / index は = で受け取って使う」の 2 パターンで押さえておけば十分です。
この記事では、リストの作り方と取り出し、スライス、追加・削除、そして並び替え・検索を学びました。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2items = [3, 1, 4, 1, 5] のとき、print(items.sort()) の出力はどれですか?
Q3data = [10, 20, 30, 40] のとき、data[-2:] の結果はどれですか?