Pythonで複数の値を順番に扱うとき、リストの長さを正しく把握することは安全なインデックス操作やループ制御の基本です。
本記事では、len()を使ってリストの要素数を取得する方法を、シンプルな例から応用、落とし穴の回避まで段階的に解説します。
初心者の方でも安心して読み進められるよう、実行例と出力を丁寧に示します。
len()とは(リストの長さを取得)
len()の基本構文と返り値(要素数)
len()は、リストなどのシーケンスや一部のコレクションに対して、要素数(長さ)を整数で返す組み込み関数です。
リストに対しては、要素の数をそのまま返し、計算量は一般にO(1)です。
リストに限らず、文字数をカウントする場合にもlen()を使用できます。
- 関連記事:文字数をカウントはlen()を使う
構文
len(obj)はintを返します。objがリストなら、要素数です。
# len() の基本例
numbers = [10, 20, 30, 40]
print(len(numbers)) # 要素数は 4
4
リストの長さは要素の数であり、最大インデックスではありません。
この点は次の節で詳しく説明します。
リストの長さを取得するシンプルな例
リストの長さをメッセージに埋め込んだり、条件分岐に使ったりできます。
fruits = ["apple", "banana", "orange"]
count = len(fruits)
print(f"フルーツは全部で {count} 個あります。")
フルーツは全部で 3 個あります。
応用の入口
要素数が0かどうかを判定したり、ループ回数の制御に使うなど、len()はプログラムの流れを決める場面で頻出します。
リストの長さとインデックスの関係(最大インデックス)
リストの有効なインデックスは0からlen(lst) - 1までです。
長さと最大インデックスを混同するとIndexErrorになります。
data = [5, 6, 7]
print("長さ:", len(data))
print("最初の要素:", data[0])
print("最後の要素:", data[len(data) - 1])
# print(data[len(data)]) # ← これは IndexError になる(コメント解除でエラー)
長さ: 3
最初の要素: 5
最後の要素: 7
目安となる対応表
| 確認したいもの | 計算式 |
|---|---|
| 要素数 | len(lst) |
| 最大インデックス | len(lst) - 1 |
| 最後の要素 | lst[-1] または lst[len(lst)-1] |
len()の使い方(リストの長さを活用)
空リストの判定(len()==0)
リストが空かどうかの判定は、安全な分岐の第一歩です。
items = []
if len(items) == 0:
print("リストは空です。要素を追加してください。")
else:
print("要素があります。処理を続行します。")
リストは空です。要素を追加してください。
補足
Pythonではif not items:でも空を判定できます。
ただし本記事ではlen()に焦点を当てます。
条件分岐でのチェック(len()>0)
要素が1つ以上ある場合のみ処理したいときに使います。
logs = ["INFO: start", "WARN: low memory"]
if len(logs) > 0:
print(f"最新のログ({len(logs)}件)を表示します。")
print("最後のログ:", logs[-1])
else:
print("ログがありません。")
最新のログ(2件)を表示します。
最後のログ: WARN: low memory
ループ回数の制御にlen()を使う
インデックスが必要なループではrange(len(lst))が役立ちます。
names = ["Alice", "Bob", "Charlie"]
for i in range(len(names)): # 0, 1, 2 を生成
print(f"{i}番目の要素: {names[i]}")
0番目の要素: Alice
1番目の要素: Bob
2番目の要素: Charlie
ベストプラクティス
インデックスと要素の両方が必要ならenumerate(names)が読みやすいです。
インデックス不要なら直接イテレートが簡潔です。
ただし、ループの回数を厳密に指定したい場合はrange(len(...))が明示的です。
スライス後の長さを確認
スライスで部分リストを作ったあと、その長さを確認できます。
nums = [0, 1, 2, 3, 4, 5, 6]
first_three = nums[:3] # 先頭3要素
middle = nums[2:5] # インデックス2〜4
evens = nums[::2] # 偶数番目
print(len(first_three), first_three)
print(len(middle), middle)
print(len(evens), evens)
3 [0, 1, 2]
3 [2, 3, 4]
4 [0, 2, 4, 6]
注意
スライスは元のリストとは独立した新しいリストです。
長さも個別に数えられます。
2次元リストの行数/総要素数を数える(len())
入れ子のリスト(2次元リスト)では、len()を重ねて使います。
matrix = [
[1, 2, 3], # 1行目: 3要素
[4, 5], # 2行目: 2要素
[6, 7, 8, 9], # 3行目: 4要素
]
rows = len(matrix) # 行数
total_elements = sum(len(row) for row in matrix) # 総要素数
print("行数:", rows)
print("総要素数:", total_elements)
行数: 3
総要素数: 9
変則的な行長
各行の長さが異なる場合でも、行ごとのlen(row)を合計すれば総要素数を正しく求められます。
平均や割合の計算にlen()を使う
平均値や割合を出す際、分母にlen()を用います。
分母が0にならないように注意します。
scores = [80, 90, 70, 100]
if len(scores) > 0:
average = sum(scores) / len(scores)
gt80 = [s for s in scores if s >= 80]
ratio = len(gt80) / len(scores) # 80点以上の割合
print(f"平均: {average:.1f}")
print(f"80点以上の割合: {ratio:.0%}")
else:
print("データが空です。平均を計算できません。")
平均: 85.0
80点以上の割合: 75%
ゼロ割防止
空リストで平均を計算するとZeroDivisionErrorになります。
必ず長さが0でないことを確かめてから割り算を行います。
よくあるエラーと注意点(len)
TypeError: len()の引数がリストでない場合
len()は整数など長さの概念を持たない型には使えません。
x = 123
print(len(x)) # 整数は長さを持たない
TypeError: object of type 'int' has no len()
解決策
- 文字数を知りたいなら
len(str(x))を使います。 - 要素数を数えたいならリストや文字列などシーケンスに変換します。
ジェネレータやイテレータにlen()は使えない
ジェネレータや多くのイテレータは事前に長さが分かりません。
gen = (i for i in range(5)) # ジェネレータ
print(len(gen)) # これは TypeError
TypeError: object of type 'generator' has no len()
対処法
- 要素数だけ必要で、消費してよいなら
sum(1 for _ in gen)で数えます(生成物は消費されます)。 - 長さが必要で、繰り返しも行いたいなら
lst = list(gen)としてリスト化し、len(lst)を使います。メモリ使用量に注意。
gen = (i for i in range(5))
# 1) 消費して数える
count = sum(1 for _ in gen)
print("要素数:", count)
# 2) もう一度作り直してリスト化
gen2 = (i for i in range(5))
lst = list(gen2)
print("len(list化):", len(lst))
print("中身:", lst)
要素数: 5
len(list化): 5
中身: [0, 1, 2, 3, 4]
組み込み名の上書きに注意(lenやlistを変数名にしない)
組み込み関数や型名を変数名で上書きすると、元の機能が使えなくなります。
len = 10 # 良くない: len を上書き
list = [1, 2, 3] # 良くない: list を上書き
# print(len([1, 2])) # ここで TypeError: 'int' object is not callable になる(コメント解除でエラー)
# (上記のprintを有効にすると)
TypeError: 'int' object is not callable
回避策
- 変数名は意味のある別名(例:
length,items_list)を使い、len,list,dictなどは避けます。 - もし上書きしてしまったら
del lenで元に戻せます(上書きしたスコープ内)。
パフォーマンスの目安(len(list)はO(1))
Pythonのリストは内部に要素数を保持しているため、len(lst)はO(1)で非常に高速です。
ループのたびにlen()を呼んでも通常は問題ありません。
# len() は繰り返し呼んでも高速(O(1))
data = list(range(100_000))
total = 0
for i in range(len(data)):
total += data[i]
print("合計:", total)
合計: 4999950000
参考
計算量O(1)とは、リストがどれだけ大きくなってもlen()の実行時間がほぼ一定であることを意味します。
まとめ
len()は、リスト操作のあらゆる場面で役立つ基本関数です。
要素数の取得はもちろん、空チェック、ループ制御、2次元リストの集計、平均や割合の計算など応用範囲が広く、計算量O(1)で高速に動作します。
一方で、最大インデックスはlen(lst)-1であること、ジェネレータに直接len()は使えないこと、組み込み名を上書きしないことに注意してください。
これらのポイントを押さえることで、初心者の方でも安全かつ効率的にリストを扱えるようになります。
