Pythonの辞書(dict型)で、リストやタプルのように、含まれている要素数をカウントするにはどうすればいいでしょうか?
リスト、タプルと同様にlen()
で要素数を取得できますが、今回は以下のような辞書データのカウントを現役エンジニアが解説しています。
- 辞書のキーの個数
- 辞書の特定の値(value)の個数
- 入れ子になった辞書のカウントについて
カウントした個数で辞書を分割(スライス作成)する方法は別の記事で解説しています。
辞書の要素数判定を応用し辞書が空か判定する方法はこちらの記事で解説しています。
結論
辞書のキー(要素)の個数
d = {'a':1, 'b':2, 'c':3}
print(len(d))
# 3
特定の値をもつ要素数
d = {'foo':10, 'bar':20, 'baz':10}
print(sum(v == 10 for v in d.values()))
# 2
実行環境
Python 3.9.2
辞書のキー(要素)の個数
以下のような辞書 d
を例に要素数(個数)を求めます。
d = {'a':1, 'b':2, 'c':3}
print(d)
# {'a': 1, 'b': 2, 'c': 3}
辞書の要素数、つまりキー・バリューをセットとする個数は len()
で取得できます。これはリストやタプルなどのシーケンスと同様です。
print(len(d))
# 3
当然ですが、明示的にキーの個数を計算しても同じ結果となります。
print(d.keys())
# dict_keys(['a', 'b', 'c'])
print(len(d.keys()))
# 3
子要素(入れ子)をもつ辞書の要素数
入れ子(多重構造)をもった辞書の要素数を len()
で取得するとどうでしょうか?
以下のようにキー'c'
が入れ子になった辞書では、len()
は親のキーの合計を返します。入れ子部分のキーは含まれないので、必要ならば別途数える必要があります。
d = {'a':1, 'b':2, 'c':{'foo':1, 'bar':2}}
print(len(d))
# 3
特定の値をもつ要素数
辞書に含まれている特定の値の個数を計算するにはどうしたらいいでしょうか?
さまざまな方法が考えられますが、ここでは関数を定義する方法とsum()
を用いる方法を解説します。
独自関数を定義する方法
辞書d
に含まれる値term
の個数を計算する関数count_by()
を定義するなら、例えば以下のように書けます。
from typing import Any
def count_by(d: dict, term: Any) -> int:
count = 0
for v in d.values():
if v == term:
count += 1
return count
d = {'foo':10, 'bar':20, 'baz':10}
print(count_by(d, 10))
# 2
sum()を使ったワンライナーで求める方法
上記の関数と同じ処理をワンライナーで書くこともできます。
ブール値を生成するジェネレータと組み込み関数sum()
を組み合わせます。
ある条件にマッチするブール値のシーケンスはジェネレータg
を使って次のように作ることができます。
d = {'foo':10, 'bar':20, 'baz':10}
g = (v == 10 for v in d.values())
print(list(g))
# [True, False, True]
sum()
はイテラブルなオブジェクトに含まれている要素の合計値を返します。数値なら合計値、真偽値ならTrueの個数を取得します。
print(sum([True, False, False, True, False]))
# 2
ジェネレータg
をsum()
に渡すと、指定した値の個数が計算されます。
d = {'foo':10, 'bar':20, 'baz':10}
print(sum(v == 10 for v in d.values()))
# 2
print(sum(v == 20 for v in d.values()))
# 1
今回参考にしたページ・資料
組み込み型 — Python 3.10.0b2 ドキュメント