Python | データ構造:len

Python
スポンサーリンク

概要(len は「大きさ」を返す基本関数)

len は、文字列・リスト・タプル・辞書・集合などの「長さ(要素数)」を整数で返す組み込み関数です。書き方は len(対象) とシンプルで、辞書ならキーの数、文字列なら文字数、リストなら要素数が返ります。

print(len("Hello"))               # 5(文字数)
print(len([10, 20, 30]))          # 3(要素数)
print(len(("a", "b")))            # 2
print(len({"name": "Hanako"}))    # 1(キー数)
print(len({1, 2, 3}))             # 3
Python

基本動作と対応するデータ型(ここが重要)

代表的な型での戻り値

  • 文字列: 含まれる文字数を返します。Unicodeの結合文字や絵文字を含む場合は“目に見える文字数”と異なることがあります(len はコードポイント基準)。
  • リスト/タプル/セット: 要素数。
  • 辞書: キーの数(ペア数)。
  • 空オブジェクト: 0 を返します。
print(len(""))           # 0(空文字)
print(len([]))           # 0(空リスト)
print(len({}))           # 0(空辞書)
Python

使えない型とエラー

数値(int/float)や None に len は使えません。ジェネレータのように「長さの概念がない」ものも同様です(TypeError)。型が不明なら、事前に isinstance で安全に分岐します。

# TypeError 例
# len(10)        # ✗
# len(None)      # ✗

def safe_len(x):
    return len(x) if hasattr(x, "__len__") else 0

print(safe_len(10))      # 0(__len__ がないため)
print(safe_len([1,2,3])) # 3
Python

性能と設計の勘所(O(1) の速さを活かす)

計算量はほぼ O(1)

len は内部に「長さ」を持つデータ構造であれば一定時間で返せるため、大きなリスト・辞書でも高速です。繰り返しの条件判定やバリデーションに安心して使えます。

nums = list(range(1_000_000))
print(len(nums))  # 高速
Python

ループや条件での使い所

  • while len(lst) > 0 のような制御は可読性が高いですが、Python では if lst: の真偽値評価が慣習的で速く、意図も明確です。
  • “空判定”は len(x) == 0 よりも、bool(x) を使う方が Python らしく簡潔です。
items = []
if not items:           # 空なら False → True による分岐
    print("空です")
Python

よくある落とし穴と安全策(重要ポイントを深掘り)

文字列の“見た目の長さ”とのズレ

len は Unicode のコードポイント数を返します。結合文字や絵文字の肌色修飾など「1文字に見えるが複数コードポイント」なケースで、画面上の文字数と異なることがあります(テキスト UI の幅計算が必要なら別途ライブラリを検討)。

s = "e\u0301"  # 合成で「é」に見える(e + 結合アキュート)
print(len(s))  # 2(見た目は1文字でもコードポイントは2)
Python

default(長さ前提の設計)に頼り過ぎない

データが None や数値に変わる可能性がある時、len に直に渡すと TypeError。事前の型正規化(空文字→””、空配列→[] を保証)か、防御的コード(hasattr/len)で回避します。

def normalize_list(x):
    if x is None:
        return []
    return x

items = normalize_list(None)
print(len(items))  # 0
Python

ジェネレータ・イテレータの長さ

ジェネレータは「流れるデータ」であり、len は使えません。必要なら list(…) に展開してから数えるか、カウンタで逐次数えます。

gen = (i for i in range(5))
# len(gen)  # ✗
count = sum(1 for _ in gen)
print(count)  # 5
Python

実用パターン(検証・集計・ループ制御)

入力検証(必須文字数・空チェック)

name = "Hanako"
if len(name) < 2:
    print("名前が短すぎます")
Python

集計(辞書の項目数・平均計算)

scores = {"math": 80, "eng": 70, "sci": 90}
avg = sum(scores.values()) / len(scores)
print(avg)  # 80.0
Python

ループの上限制御

items = ["a", "b", "c"]
for i in range(len(items)):
    print(i, items[i])
Python

例題で身につける(定番から一歩先まで)

例題1:文字列・配列の基本

print(len("Python"))     # 6
print(len([1, 2, 3, 4])) # 4
Python

例題2:辞書のキー数と空判定

user = {"name": "Hanako", "age": 20}
print(len(user))   # 2
if user:
    print("空ではない")
Python

例題3:バリデーション(最小長の検査)

password = "abc123"
MIN_LEN = 6
if len(password) < MIN_LEN:
    print("短すぎます")
Python

例題4:ジェネレータの要素数を数える

gen = (n for n in range(100) if n % 10 == 0)
count = sum(1 for _ in gen)
print(count)  # 10
Python

まとめ

len は「長さ・要素数」を返す標準関数で、文字列・リスト・辞書・集合など幅広く使えます。計算量は概ね O(1) と高速で、検証・集計・ループ制御に最適。一方、数値/None/ジェネレータでは TypeError になるため、型の正規化や防御的な分岐を忘れずに。文字列の“見た目の長さ”とコードポイントの差にも注意しておくと、実務での混乱を防げます。

タイトルとURLをコピーしました