Pythonのリストに何個の要素が入っているかは、組み込み関数len()で一瞬にして調べられます。
本記事では、len()の構文から空リストの扱い、要素の追加や削除後の再確認、実務での使い方のコツ、2次元リストの数え方、初心者がつまずきやすい注意点まで、動くサンプル付きで丁寧に解説します。
リストの長さを取得するlen()の基本
len()の構文と返り値
len()
は、コンテナの要素数を整数で返す関数です。
リストに対しては、格納されている要素の個数を即座に返します。
サンプルコード
# 基本のlen()。要素数が3のリスト
colors = ["red", "green", "blue"]
count = len(colors) # 3が返る
print("要素数:", count) # 整数が返る点に注目
要素数: 3
ポイント
- 返り値は整数(int)です。
- リストの中身の型(文字列、数値、他のリストなど)に関係なく、要素の数だけを数えます。
空リストの長さを確認する
空のリストの長さは0です。
空かどうかを数で確認したいときにも使えます。
# 空リストの長さは0
empty = []
print(len(empty)) # 0が表示される
0
要素の追加・削除後にlen()で再確認
len()
は現在の状態の要素数を返すため、リスト操作の前後で呼び出すと、変化を追跡できます。
numbers = [10, 20]
print("初期:", len(numbers)) # 2
# 末尾に1要素追加
numbers.append(30)
print("append後:", len(numbers)) # 3
# 複数要素をまとめて追加
numbers.extend([40, 50])
print("extend後:", len(numbers)) # 5
# 末尾の要素を1つ削除
numbers.pop()
print("pop後:", len(numbers)) # 4
# 値が20の要素を削除(最初に見つかったもの)
numbers.remove(20)
print("remove後:", len(numbers)) # 3
# すべての要素を削除
numbers.clear()
print("clear後:", len(numbers)) # 0
初期: 2
append後: 3
extend後: 5
pop後: 4
remove後: 3
clear後: 0
len()の実用例と書き方のコツ
空リスト判定のベストプラクティス
リストが空かどうかを判定する場合、Pythonでは「真偽値コンテキスト」を活用するのが簡潔です。
if not my_list:
が最も読みやすく、慣用的です。
items = []
# Pythonicな書き方(推奨)
if not items:
print("空です")
else:
print("要素があります")
# 明示的にlen()を使う書き方(可読性はやや冗長)
if len(items) == 0:
print("lenで空を判定しています")
空です
lenで空を判定しています
条件分岐で要素数をチェックする
閾値で分岐したい場合は、len()
の結果をそのまま比較します。
# 例: 7件のメッセージがある
messages = ["m" + str(i) for i in range(7)] # ["m0", "m1", ... "m6"]
if len(messages) >= 10:
print("10件以上です")
elif 1 <= len(messages) < 10:
print(f"{len(messages)}件ありますが、10件未満です")
else:
print("空です")
7件ありますが、10件未満です
インデックスが必要なループのrange(len())
要素の位置(インデックス)が必要な場合は、range(len(list))
が使えます。
インデックスと値の両方が欲しいときはenumerate()
が読みやすいです。
fruits = ["apple", "banana", "cherry"]
# インデックスが必要なときのrange(len())
for i in range(len(fruits)):
print(i, fruits[i]) # 位置iと要素fruits[i]を同時に扱える
# 代替: enumerateでインデックスと値を同時に取り出す
for i, name in enumerate(fruits):
print(i, name.upper()) # 値を加工しつつ表示
0 apple
1 banana
2 cherry
0 APPLE
1 BANANA
2 CHERRY
まとめ表(よく使うパターン)
ケース | 推奨される書き方 | 補足 |
---|---|---|
空かどうか判定 | if not lst: | 可読性が高い |
非空か判定 | if lst: | 要素が1つ以上あるか |
閾値で判定 | if len(lst) >= N: | 正確に件数で分岐 |
インデックスが不要 | for x in lst: | 最もシンプル |
インデックスが必要 | for i in range(len(lst)): | 位置指定が必要なとき |
インデックス+値 | for i, x in enumerate(lst): | 読みやすく安全 |
二重リストの長さを数える方法
行数はlen(リスト)で数える
2次元リスト(リストの中にリストが入っている構造)では、外側のリストの長さが行数です。
# 3行×3列の2次元リスト
matrix = [
[1, 2, 3], # 1行目
[4, 5, 6], # 2行目
[7, 8, 9], # 3行目
]
rows = len(matrix)
print("行数:", rows)
行数: 3
列数はlen(先頭の行)で数える
等長の2次元リスト(各行の長さが同じ)なら、先頭の行の長さが列数です。
空リストに備えてガードを書くと安全です。
# 3行×3列の2次元リスト
matrix = [
[1, 2, 3], # 1行目
[4, 5, 6], # 2行目
[7, 8, 9], # 3行目
]
# 先頭の行の長さで列数を数える
cols = len(matrix[0]) if matrix else 0
print("列数:", cols)
# 参考: 先頭行が空だったり、行ごとに長さが異なる場合の扱い
ragged = [[1, 2], [], [3, 4, 5]] # 不揃いな2次元リスト
cols_ragged = len(ragged[0]) if ragged and ragged[0] else 0
print("先頭行の列数(不揃い):", cols_ragged)
列数: 3
先頭行の列数(不揃い): 2
不揃いの2次元リストでは注意
行ごとに列数が異なる場合、全体の「最大列数」を知りたいなら先頭行ではなく、各行の長さの最大値を取ります。
ragged = [[1, 2], [], [3, 4, 5]]
max_cols = max((len(row) for row in ragged), default=0)
print("最大列数:", max_cols)
最大列数: 3
2次元リストの全要素数を求める
全要素数は、等長なら行数×列数、不揃いなら各行の長さの合計で求めます。
# 等長の2次元リスト
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
rows = len(matrix)
cols = len(matrix[0]) if matrix else 0
total_rect = rows * cols
print("全要素数(等長):", total_rect) # 3×3=9
# 不揃いの2次元リスト
ragged = [[1, 2], [], [3, 4, 5]]
total_ragged = sum(len(row) for row in ragged)
print("全要素数(不揃い):", total_ragged) # 2+0+3=5
全要素数(等長): 9
全要素数(不揃い): 5
よくあるエラーと注意点
Noneや数値にlen()は使えない
len()は「長さ」という概念を持つオブジェクトにのみ使えます。
None
や整数など、長さを持たない値に対して呼ぶとTypeError
になります。
samples = [None, 10]
for x in samples:
try:
# 長さを持たない値にlen()を呼ぶとTypeError
print("len(", x, ") =", len(x))
except TypeError as e:
print(f"TypeError: {e}")
TypeError: object of type 'NoneType' has no len()
TypeError: object of type 'int' has no len()
補足
- リスト、文字列、タプル、辞書、集合などは長さを持ちますが、イテレータやジェネレータは長さを持たないことが多く、同様に
TypeError
になります。 - 本記事の主題はリストなので、他の型の扱いはここでは詳細を省きます。
len()はリストで即時に計算される
Pythonのリストは要素数を内部に保持しているため、len(list)
は要素数に比例した時間はかからず、一定時間(計算量O(1))で返ります。
# 大きなリストでもlen()は即時(O(1))
big_list = list(range(1_000_000)) # 100万要素
print("len(big_list) =", len(big_list))
len(big_list) = 1000000
メモ
len()
はリスト全体を走査しません。したがって、非常に大きいリストでも要素数の取得は高速です。- 一方で、
sum(x for x in list)
のような処理は走査が必要です。用途に応じて使い分けてください。
len()の結果を文字列にして出力する
文字列連結に整数のままのlen()
を使うとTypeError
になります。
文字列化するか、f文字列を使うのが安全です。
items = [1, 2, 3]
# 失敗例: 文字列と数値の直接連結
try:
print("要素数は" + len(items) + "個です") # TypeError
except TypeError as e:
print(f"結合に失敗: {e}")
# 正解1: f文字列で埋め込む(推奨)
print(f"要素数は{len(items)}個です")
# 正解2: strで明示変換
print("要素数は" + str(len(items)) + "個です")
# 正解3: formatを使う
print("要素数は{0}個です".format(len(items)))
結合に失敗: can only concatenate str (not "int") to str
要素数は3個です
要素数は3個です
要素数は3個です
まとめ
len()は、リストの要素数を即座に知るための基本かつ強力な関数です。
空リストの確認から、要素追加・削除後の再計測、閾値による条件分岐、range(len())
を使ったインデックス付きループまで、日常的な場面で頻出します。
2次元リストでは、len(外側)
が行数、len(先頭の行)
が列数であり、全要素数は等長なら「行×列」、不揃いなら「各行の長さの合計」で求めるのが定石です。
加えて、None
や数値にlen()は使えないこと、リストに対するlen()はO(1)で高速に返ること、文字列連結時はf文字列やstr()
で型を揃えることを覚えておくと、エラーの回避と可読性の向上に役立ちます。
まずは小さな例から慣れ、実務の場面でも迷わず使えるようにしていきましょう。