HOWTO · Python

Python リストの要素を数える

このチュートリアルでは、Python でリスト内の要素をカウントする方法を示します

このページの内容

「リスト内の要素を数える」というタスクには 3 つの異なる意味があり、Python にはそれぞれに直接対応するツールがあります。アイテムの総数が必要な場合は len()、1 つの値の出現回数が必要な場合は list.count()、すべての値の頻度を一度に取得したい場合は collections モジュールの Counter を使用します。辞書を使った手動ループでも同じ頻度の結果が得られ、カウントの仕組みを正確に確認できます。このチュートリアルでは、実行可能な例を使って各メソッドを順に紹介するので、自分のタスクに合ったアプローチを選べます。

len() でアイテムの総数を取得する

組み込みの len() 関数は、リスト内のトップレベルのアイテム数を返します。数値、文字列、ブール値、さらには他のリストなど、あらゆる要素型で機能します。これはリスト内の値ではなくリスト自体を測定するためです。

次の例を実行します:

このセクションのコードと表示されるラベルや出力は英語のままです。

items = [10, "apple", 3.14, [1, 2, 3]]

print(len(items))
4

このリストには、整数、文字列、浮動小数点数、ネストされたリストという 4 つのアイテムが含まれています。ネストされたリスト [1, 2, 3] は外側のレベルで 1 つのアイテムとしてカウントされるため、len() は 4 を返します。ネストされたリスト内のアイテムも含めたい場合は、先に構造を平坦化するか、内側のリストの長さを個別に合計してください。len() がトップレベルより深くを見ることはありません。

list.count() で 1 つの値の出現回数をカウントする

list.count() メソッドは、指定した値がリスト内に何回出現するかを返します。探している値を渡すだけで、リストがスキャンされます:

このセクションのコードと表示されるラベルや出力は英語のままです。

my_list = [1, 2, 3, 2, 1, 4, 2]

print(my_list.count(2))
print(my_list.count(9))
3
0

値 2 は 3 回出現しますが、9 は一度も出現しないため、2 回目の呼び出しは 0 を返します。list.count() は、文字列や混合データを含め、リストが保持できるあらゆる要素型で機能します。

2 つの制限に注意してください。各呼び出しは 1 つの値について答えるだけなので、3 つの異なる値をカウントするには 3 回個別に呼び出す必要があります。完全な頻度分布を得るには、代わりに Counter またはループを使用してください。また、ネストされたリストでは、list.count() は渡した値と等しいアイテム全体のみを一致の対象とします。ネストされたリスト内に格納された値は、先にリストを平坦化しない限り認識されません。

Counter ですべての値をカウントする

collections モジュールの Counter クラスは、1 回の走査ですべての値の頻度マップを構築します。各要素をそのカウントに対応付ける辞書のように動作します:

このセクションのコードと表示されるラベルや出力は英語のままです。

from collections import Counter

my_list = [1, 2, 3, 2, 1, 4, 2]
element_count = Counter(my_list)

print(element_count)
print(element_count[2])
print(element_count[9])
Counter({2: 3, 1: 2, 3: 1, 4: 1})
3
0

Counter へのインデックス指定は辞書と同じように機能しますが、便利な違いが 1 つあります。一度もカウントされていないキーを読み取っても、エラーにならず 0 が返されるため、element_count[9] は安全に 0 を出力します。

各値は内部的に辞書のキーになるため、すべての要素がハッシュ可能である必要があります。整数、文字列、タプルはこれに該当しますが、ネストされたリストは該当しません。ハッシュ不可能なアイテムを含むリストでは、先にアイテムをハッシュ可能な形式に変換するか、別のアプローチでカウントしてください。

ループで頻度辞書を構築する

辞書を使ったシンプルなループでも同じ頻度が得られ、仕組みをはっきりと確認できます。辞書を初期化し、リストを走査しながら各要素のカウントを増やします:

このセクションのコードと表示されるラベルや出力は英語のままです。

my_list = [1, 2, 3, 2, 1, 4, 2]
element_count = {}

for element in my_list:
    if element in element_count:
        element_count[element] += 1
    else:
        element_count[element] = 1

print(element_count)
{1: 2, 2: 3, 3: 1, 4: 1}

結果は各値をそのカウントに対応付けます。2 は 3 回、1 は 2 回、3 と 4 は 1 回ずつ出現します。このパターンはリストを 1 回走査するだけで、完全な制御が得られます。カウントする前に各要素を変換したり、選択した値をスキップしたり、単純なカウント以外の値を累積したりできます。同じハッシュ可能性の制約が適用されます。すべての要素が辞書のキーになるため、ネストされたリストのようなハッシュ不可能なアイテムは、先に変換または平坦化する必要があります。

これらのツールを使い分けるには、メソッドを質問に合わせます。アイテムの総数には len()、1 つの値には list.count()、完全な頻度マップには Counter または辞書ループを使用します。