Pythonで複数の値を扱うとき、最初に覚えたい基本がリスト(list)です。
リストは順序を保ったまま値をまとめ、後から増やしたり、特定の位置を参照したりできます。
本記事では、作り方のバリエーションと使いどころを、初心者の方にも無理なく理解できるように順を追って解説します。
リスト(list)入門
複数のデータを順番に管理する
順序と位置(インデックス)
リストは中身の順序をそのまま保持する入れ物です。
先頭の要素はインデックス0で表し、次が1、その次が2というように続きます。
最後から数える場合は-1、-2のように負のインデックスを使います。
サンプルコード
# 複数の要素を順番に持つリスト
fruits = ["apple", "banana", "cherry"]
print(fruits) # リスト全体
print(fruits[0]) # 0番目(先頭)の要素
print(fruits[2]) # 2番目の要素
print(fruits[-1]) # 最後の要素(負のインデックス)
['apple', 'banana', 'cherry']
apple
cherry
cherry
リストの特徴 可変 重複可 順序保持
3つの柱
リストには次の特徴があります。
これらは「どんなときにリストを選ぶべきか」を判断する軸になります。
- 可変(ミュータブル): 作成後に中身を変更できます。
- 重複可: 同じ値を複数入れても構いません。
- 順序保持: 追加した順序を保ちます。
以下の表は特徴の要点です。
特徴 | 意味 | 例 |
---|---|---|
可変 | 値の追加・更新・削除ができる | 後から要素を増やす |
重複可 | 同じ値を複数持てる | [1, 1, 2] のように1が重複 |
順序保持 | 入れた順のまま取り出せる | 一覧や手順の管理 |
サンプルコード
# 重複を含むリストと、変更(可変)の例
numbers = [1, 1, 2]
print(numbers) # 重複を許す
numbers[0] = 99 # 0番目の要素を更新(可変)
numbers.append(3) # 要素を末尾に追加(可変)
print(numbers)
[1, 1, 2]
[99, 1, 2, 3]
初心者が押さえる基本
インデックスと長さ、存在確認
リストの大きさは len(リスト)
で調べられ、特定の値が含まれるかは in
で判定できます。
負のインデックスは最後の要素から数えると覚えると便利です。
colors = ["red", "green", "blue"]
print(len(colors)) # 要素数
print("green" in colors) # 含まれるかどうか
print(colors[-1]) # 最後の要素
3
True
blue
リストの作り方
空リストを作る [] と list
使い分けの考え方
空のリストはリテラルの []
か、コンストラクタの list()
で作ります。
機能的な違いはほぼないため、短く読みやすい []
がよく使われます。
# 2つの等価な空リストの作成方法
empty1 = []
empty2 = list()
print(empty1, type(empty1), len(empty1))
print(empty2, type(empty2), len(empty2))
[] <class 'list'> 0
[] <class 'list'> 0
値を並べて作る リテラル
角かっこで並べる基本形
最も直感的な方法はリテラル(角かっこ)で値をカンマ区切りに並べる形です。
数値や文字列をそのまま混在させることもできますが、初心者のうちは型をそろえると混乱が少ないです。
numbers = [10, 20, 30] # 数値のリスト
words = ["apple", "banana", "cherry"]# 文字列のリスト
mixed = [42, 3.14, "python", True] # 混在型(必要な場合のみ)
print(numbers)
print(words)
print(mixed)
[10, 20, 30]
['apple', 'banana', 'cherry']
[42, 3.14, 'python', True]
rangeや文字列から作る
反復可能なオブジェクトを list に変換
range
は連続した整数の並びを作る便利な仕組みです。
文字列を list()
に渡すと文字ごとのリストになり、単語ごとに分けたい場合は split()
を使います。
# range から作る
r1 = list(range(5)) # 0,1,2,3,4
r2 = list(range(1, 10, 2)) # 1から9まで2刻み
# 文字列から作る
chars = list("Hello") # 1文字ずつ
words = "apple orange banana".split() # 空白で区切って単語のリストに
print(r1)
print(r2)
print(chars)
print(words)
[0, 1, 2, 3, 4]
[1, 3, 5, 7, 9]
['H', 'e', 'l', 'l', 'o']
['apple', 'orange', 'banana']
内包表記で作る
作りながら加工・抽出できる表現
内包表記は「作る」と「変換/絞り込み」を一度に書ける強力な記法です。
読みやすさを保つ範囲で使うと、短く明快なコードになります。
# 基本形: 値を変換しながら作る
squares = [n * n for n in range(1, 6)] # 1〜5の二乗
# 条件付き: 偶数だけ二乗
even_squares = [n * n for n in range(1, 11) if n % 2 == 0]
print(squares)
print(even_squares)
[1, 4, 9, 16, 25]
[4, 16, 36, 64, 100]
ネストしたリストを作る
2次元の表(グリッド)をリストで表現
「行のリスト」の各行が「列のリスト」という構造で、2次元の表を表現できます。
初期化には内包表記が安全です。
# 3行×4列を0で埋めたグリッド
rows, cols = 3, 4
grid = [[0 for _ in range(cols)] for _ in range(rows)]
# 2行目(インデックス1)の3列目(インデックス2)に値を立てる
grid[1][2] = 1
for row in grid:
print(row)
[0, 0, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 0]
よくある注意点(参照の共有)
[[0] * 4] * 3
のように乗算で行を複製すると、同じ1つの行を3回参照する状態になり、1箇所を書き換えると全行に反映されてしまいます。
# 良くない初期化例: 3行が同じオブジェクトを参照
bad = [[0] * 4] * 3
bad[1][2] = 9
for row in bad:
print(row) # 3行すべてに9が現れてしまう
[0, 0, 9, 0]
[0, 0, 9, 0]
[0, 0, 9, 0]
上記の悪いサンプルを内包表記で書き直すとこのようになります。
# 良い初期化例: 各行は独立したオブジェクト
good = [[0] * 4 for _ in range(3)]
good[1][2] = 9
for row in good:
print(row) # 変更は1行だけに反映される
こうすると各行が独立したリストになるので、1行を変更しても他の行には影響しません。
リストの使いどころ
順序が大事なデータに最適
手順や履歴、並び順に意味がある情報
リストは「順番が意味を持つ」データに向いています。
レシピの手順、処理のステップ、訪問履歴、曲順などは代表例です。
# 手順を順番どおりに表示
steps = ["準備", "調理", "盛り付け"]
for i, step in enumerate(steps, start=1): # 1から番号付け
print(f"Step {i}: {step}")
Step 1: 準備
Step 2: 調理
Step 3: 盛り付け
重複を許す収集に便利
同じ出来事が複数回起こり得る場面
ユーザーのクリック履歴やアクセスしたページ、同じタグを複数回付与するような場面では、重複をそのまま残すことに意味があります。
リストなら自然に扱えます。
visited = [] # 空の履歴
visited.append("home")
visited.append("search")
visited.append("home") # home に再訪問(重複)
print(visited)
print(len(visited)) # 3件(重複を含めた件数)
['home', 'search', 'home']
3
後から要素を増やす可能性があるとき
ログや計測値の蓄積
リストは可変なので、実行中にどんどん追加できます。
時間とともに増えるログや測定値の蓄積に向いています。
# 時系列に読み取った温度を蓄積
temperatures = []
for reading in [23.4, 24.1, 25.0]:
temperatures.append(reading)
temperatures[1] = 24.0 # 記録の訂正も可能(可変)
print(temperatures)
[23.4, 24.0, 25.0]
forで順番に処理したいとき
先頭から末尾へ、順番に取り出す
リストは順序を保つため、for
で先頭から末尾まで順番に処理するのが自然です。
表示や集計、検査など、多くの基本処理がこの形に当てはまります。
queue = ["Aさん", "Bさん", "Cさん"]
for user in queue:
print(f"次の人: {user}")
次の人: Aさん
次の人: Bさん
次の人: Cさん
リストを選ぶ判断基準
どの入れ物を使うかの目安
「順序が意味を持ち、重複を許し、後から増減があり得る」なら、まずリストを選ぶのが定石です。
他の入れ物(辞書・タプル・セット)の詳細は別記事で扱いますが、ざっくり比較を示します。
型 | 順序保持 | 重複 | 可変 | 主な用途 |
---|---|---|---|---|
list | する | 可 | する | 順序付きの収集 |
tuple | する | 可 | しない | 変更しない並び |
set | しない | 不可 | する | 重複排除・集合演算 |
dict | する(3.7+) | キーは一意 | する | キーと値の対応 |
dict はPython 3.7以降、挿入順を保持します。
現時点(2025年9月)でのPythonの最新バージョンは3.13であるため、最新バージョンを使っているなら問題ありませんが、3.6以下では使用が異なる(順序が保証されない)ので注意してください。
まとめ
リスト(list)は、順序を保ったまま複数の値をまとめられる、Pythonの最重要データ構造の1つです。
本記事では、空リストやリテラル、range
や文字列からの変換、内包表記、ネストといった代表的な作り方を示し、どんな場面に向いているかを具体例で確認しました。
順序が意味を持ち、重複を許し、後から増える可能性があるデータには、まずリストを選ぶと良いでしょう。
辞書・タプル・セットとの細かな使い分けは別の記事で深掘りしつつ、まずはリストを自在に作り扱う感覚を身につけてください。