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 または辞書ループを使用します。