辞書(dict)

【Python】辞書(dict)内包表記の使い方

【Python】辞書(dict)内包表記の使い方

Pythonの辞書内包表記(dictionary comprehension)の使い方について解説します。

辞書内包表記(dictionary comprehension)

Pythonにおける辞書内包表記(dictionary comprehension)は、既存のリストや辞書などのイテラブル(iterable)なオブジェクトから新たな辞書を作成する際にシンプルに記載するための定義方法のことを言います。

本記事では、辞書内包表記の基本的な使い方について紹介します。

Note

イテラブル(iterable)なオブジェクトとは反復可能なオブジェクトでリスト(list)、タプル(tuple)、辞書(dict)等が代表的なものになります。また、__iter__()メソッドかもしくは__getitem__()メソッドを持つ任意のクラスのオブジェクトもfor文の繰り返しで使用することができます。

イテラブル(iterable)に関する公式ドキュメントの説明はこちらを参照してください。

辞書内包表記の使い方

辞書内包表記の構文は以下になります。

辞書内包表記
{キー: 値 for 仮変数 in イテラブルなオブジェクト if 条件}

上記の意味合いとしては、”イテラブルなオブジェクト”から要素を順番に”仮変数”に取得し、”条件”に一致するものを使って{キー: 値}を持つ辞書を作るということになります。

なかなか文章で書いても実感がわかないと思いますので、以降で簡単な例を使って辞書内包表記の使い方を確認しましょう。以降では「既存リストから辞書を作成する」方法と「既存の辞書から新しい辞書を作成する」方法について紹介します。

既存リストから辞書を作成する場合

キーと値のそれぞれのリストが既に用意されているときに、それらのリストから辞書を作成するには以下のようにします。

# キーと値のそれぞれのリストから辞書を作成する例
keys = ["k1", "k2", "k3", "k4", "k5"]
values = [10, 20, 30, 40, 50]

data = {k: v for k, v in zip(keys, values) if v >= 30}
print(f"data: {data}")
【実行結果】
data: {'k3': 30, 'k4': 40, 'k5': 50}

上記は、keysとvaluesのリストから順番に仮変数のk, vに値を取り出し、値であるvが30以上のものを使って辞書を作成します。

複数のリストの要素をまとめて取り出しているのでzip関数を使用しています。zip関数については「zipを用いたfor文の使い方 ~複数のリストをまとめて処理~」でまとめていますので興味があれば参考にしてください。

辞書内包表記を使用しないで既存リストから辞書を作成する場合

辞書内包表記を使用しない形でプログラムを記述することももちろん可能です。上記例を内包表記を使用しないで記載する場合は以下のようになります。

# キーと値のそれぞれのリストから辞書を作成する例
keys = ["k1", "k2", "k3", "k4", "k5"]
values = [10, 20, 30, 40, 50]

# 内包表記を使わない場合
data = {}
for k, v in zip(keys, values):
    if v >= 30:
        data[k] = v
print(f"data: {data}")
【実行結果】
data: {'k3': 30, 'k4': 40, 'k5': 50}

既存の辞書から新しい辞書を作成する場合

既存の辞書から新しく辞書を作成するには以下のようにします。ある条件に一致するようなデータを抽出して辞書を作成するような場合に便利です。

# 辞書から新しい辞書を作成する例
d = {"k1": 10, "k2": 15, "k3": 20, "k4": 25, "k5": 30}

data = {k: v for k, v in d.items() if v % 2 == 0}
print(f"data: {data}")
【実行結果】
data: {'k1': 10, 'k3': 20, 'k5': 30}

上記は、既存辞書のitemsメソッドを使用して辞書から順番に仮変数のk, vに値を取り出し、値が偶数(2で割り切れる)の要素を取り出して辞書を作成します。

辞書のitemsメソッドについては「辞書(dict)の内容を列挙して扱う方法 ~ keys, values, items ~」にまとめていますので興味があれば参考にしてください。

辞書内包表記を使用しないで既存の辞書から新しい辞書を作成する場合

辞書内包表記を使用しない形でプログラムを記述することももちろん可能です。上記例を内包表記を使用しないで記載する場合は以下のようになります。

# 辞書から新しい辞書を作成する例
d = {"k1": 10, "k2": 15, "k3": 20, "k4": 25, "k5": 30}

# 内包表記を使わない場合
data = {}
for k, v in d.items():
    if v % 2 == 0:
        data[k] = v
print(f"data: {data}")
【実行結果】
data: {'k1': 10, 'k3': 20, 'k5': 30}

辞書内包表記を積極的に使用するべき理由と注意点

上記で辞書内包表記の基本的な使い方を紹介しました。

例を見てみると、辞書内包表記はシンプルに記載できていることが分かったかと思います。また、辞書内包表記は、辞書内包表記を使用しない記載方法よりも処理速度が速いという特徴があるため、積極的に使用するように意識するとよいでしょう。

ただし、注意点として条件が複雑な場合等には、必ずしも辞書内包表記を採用するべきではありません。

チームでの開発をしている場合には、チームメンバーの他の人もソースを読むことになるため、読みやすく内容を理解しやすいように可読性を意識したコードを書くことが重要です。辞書内包表記を使うことでコードが複雑になってしまう恐れがある場合には、辞書内包表記を使用するべきかよく検討するようにしましょう。

まとめ

Pythonの辞書内包表記(dictionary comprehension)の使い方について解説しました。

辞書内包表記(dictionary comprehension)は、既存リストや辞書などのイテラブル(iterable)なオブジェクトから新たな辞書を作成する際にシンプルに記載するための定義方法のことを言います。

辞書内包表記を用いるとシンプルな記載ができる上に、処理速度が高速であるという特徴があります。一方で、条件等が複雑な場合には可読性が悪くなり、読みにくくなってしまうこともあるため、複雑なケースでは使用するべきかよく検討しましょう。

Pythonにおける内包表記は他にも「リスト内包表記」「集合内包表記」「ジェネレータ内包表記」といった種類があります。内包表記については、「内包表記(まとめ)」にまとめていますので興味があれば参考にしてください。