Python Tech 辞書

Python 辞書のキー, 特定の値の個数をカウントする方法

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

 

ジェネレータgsum()に渡すと、指定した値の個数が計算されます。

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 ドキュメント

 

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。多くの人に役立つ情報のシェアが目標です。

人気の記事

1

会社員でプログラマーとして働いている人、インフラやネットワークのエンジニアとして働いている人の中には、フリーランスのプログラマーとして独立、もしくは転向したい人もいるので ...

2

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるよう ...

3

フリーランスのプログラマーにとって収入の向上に最も直結するのはスキルです。 必要なスキル、スキルの獲得方法が気になる人も多いでしょう。 また、これからフリーランスを目指す ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのス ...

5

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 ...

-Python, Tech, 辞書
-,