Python で Defaultdict を使用する方法とタイミング

公開: 2022-10-06

このチュートリアルでは、Python のコレクション モジュールからdefaultdictを使用して、Python 辞書を操作するときに KeyErrors をより適切に処理する方法を学習します。

Python では、ディクショナリは、キーと値のペアでデータを格納する強力な組み込みデータ構造です。 キーを使用してディクショナリを利用し、値にアクセスします。

ただし、コードの実行中に変更される Python スクリプトに複数の辞書がある場合、多くの場合、KeyErrors が発生します。 そして、それらを処理する方法はいくつかあります。

このチュートリアルでは、次のことを学習します。

  • KeyError とは何か、なぜ発生するのか
  • KeyError の処理方法
  • 組み込みの dict クラスを継承するサブクラスである Python の defaultdict を使用して、不足しているキーをより適切に処理する方法

さぁ、始めよう!

Python の KeyErrors とは?

1

Python 辞書を定義するときは、次のことを確認するように注意する必要があります。

  • キーは一意である必要があります - 繰り返しはありません。
  • 既存の iterable をディクショナリのキーとして使用する場合は、タプルなどの不変コレクションを使用することをお勧めします。

したがって、キーはディクショナリに存在する場合にのみ有効です。 そうしないと、KeyErrors が発生します。

次のディクショナリbooks_authorsを考えてみましょう。キーは本の名前で、値は著者の名前です。

Python REPL でこのチュートリアルと一緒にコーディングできます。

 books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }

キー (本の名前) を使用して、著者の名前にアクセスできます。

 books_authors['Hyperfocus'] 'Chris Bailey'

ディクショナリ内のすべてのキーと値のペアにアクセスするには、以下に示すように、ディクショナリ オブジェクトでitems()メソッドを呼び出すことができます。

 for book,author in books_authors.items(): print(f"'{book}' by {author}")
 'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha

辞書に存在しないキーの値にアクセスしようとすると、Python インタープリターは KeyError を発生させます。 存在しないキー、つまり「Grit」と「存在しないキー」の値にアクセスしようとすると、KeyError が発生します。

 books_authors['Grit']
 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
 books_authors['non-existent-key']
 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'

では、Python で KeyErrors をどのように処理するのでしょうか?

それを行う方法はいくつかありますが、次のセクションで学習します。

Python で KeyErrors を処理する方法

Python で KeyErrors を処理する方法

以下を使用して KeyErrors を処理する方法を学びましょう。

  • If-else 条件ステートメント
  • try-except ブロック
  • 辞書メソッド.get()

#1。 If-Else 条件ステートメントの使用

Python で KeyErrors を処理する最も簡単な方法の 1 つは、if-else 条件ステートメントを使用することです。

Python では、if-else ステートメントの一般的な構文は次のとおりです。

 if condition: # do this else: # do something else
  • 条件がTrueの場合、 if本体のステートメントが実行されます。
  • 条件がFalseの場合、 else本体のステートメントが実行されます。

この例では、条件はキーが辞書に存在するかどうかを確認することです。

キーがディクショナリに存在する場合、 in演算子はTrueを返し、 body が実行されると、対応する値が出力されます。

 key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha

キーがディクショナリに存在しない場合、 in演算子はFalseを返し、 else本体が実行されます。 キーが存在しないというメッセージが出力されます。

 key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!

#2。 Try-Except ステートメントの使用

2

KeyError を処理するもう 1 つの一般的な方法は、Python で try-except ステートメントを使用することです。

次のコード ブロックを読んでください。

 key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
  • tryブロックは、指定されたキーに対応する値を取得しようとします。
  • キーが存在しない場合、インタープリターは KeyError を発生させます。これは、 exceptブロック内で例外として処理されます。

#3。 .get() メソッドの使用

Python では、組み込みの辞書メソッド .get() を使用して不足しているキーを処理できます。

get()メソッドを使用する一般的な構文はdict.get(key,default_value)です。ここで、 dictは Python で有効な辞書オブジェクトです。

– キーがディクショナリに存在する場合、 get()メソッドは値を返します。
– それ以外の場合は、デフォルト値を返します。

この例では、 keysはアクセスしたい値を持つキーのリストです。 キー リストをループして、 books_authorsディクショナリから対応する値を取得します。

ここでは、「存在しない」をデフォルト値として .get() メソッドを使用しました。

 keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))

上記のコードでは:

  • books_authorsディクショナリに存在するキーの場合、 .get()メソッドは対応する値を返します。
  • キーが存在しない場合 (この場合は「Grit」と「Make Time」)、.get() メソッドはデフォルト値の「存在しません」を返します。
 # Output Does not exist Chris Bailey Does not exist Cal Newport

上記の方法はすべて、重要なエラーの処理に役立ちます。 ただし、それらは冗長であり、不足しているキーを明示的に処理する必要があります。 通常のディクショナリの代わりにdefaultdictを使用すると、このプロセスを簡素化できます。

Python の Defaultdict

python-defaultdict

defaultdict は辞書 ( dict ) クラスのサブクラスです。 したがって、Python 辞書の動作を継承します。 さらに、不足しているキーもネイティブに処理します。

defaultdictは、 collectionsモジュール内の Python 標準ライブラリに組み込まれているコンテナー データ型です。

したがって、作業環境にインポートする必要があります。

 from collections import defaultdict

defaultdictを使用する一般的な構文は次のとおりです。

 defaultdict(default_factory)

int、float、list などの callable をdefault_factory属性として指定できます。 default_factoryの値を指定しない場合、デフォルトでNoneになります。

探しているキーが存在しない場合、 __missing__()メソッドがトリガーされ、 default_factoryからデフォルト値を推測します。 次に、このデフォルト値を返します。

要約すれば:

  • Python では、キーが存在しない場合、 defaultdictはデフォルト値を返します。
  • また、このキーとデフォルト値のペアをディクショナリに追加します。これは後で変更できます。

Python Defaultdict の例

Defaultdict-例-1

次に、Python の defaultdict がどのように機能するかを理解するために、いくつかの例をコーディングします。

デフォルトの整数値を使用した Python の Defaultdict

まず、 collectionsモジュールからdefaultdictをインポートします。

 from collections import defaultdict import random

defaultdict pricesを作成しましょう。

 prices = defaultdict(int)

次に、 fruitsリストのアイテムをキーとして使用して、 prices辞書を作成します。 そして、 price_listから値をランダムにサンプリングして、値を取得します。

 price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)

pricesの defaultdict のキーと値のペアを見てみましょう。

 print(prices.items())
 dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])

通常の Python 辞書と同様に、次のキーを使用してprices defaultdict の値にアクセスできます。

 prices['apple'] # 23

ここで、存在しない果物、たとえば「オレンジ」の価格にアクセスしてみましょう。 デフォルト値のゼロを返すことがわかります。

 prices['orange'] # 0

ディクショナリを出力すると、新しいキー 'orange' がデフォルトの整数値 0 で追加されていることがわかります。

 print(prices.items())
 dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])

List をデフォルト値とする Python の Defaultdict

students_majorsをリストのdefaultdictとして定義しましょう。 メジャーの名前がキーです。 値は、数学、経済学、コンピューター サイエンスなど、各専攻を追求している学生のリストです。

 from collections import defaultdict students_majors = defaultdict(list)

「経済学」に対応する学生リストにアクセスしようとすると、defaultdict は空のリストを返します。 キーエラーなし!

 students_majors['Economics'] # []

これで、「経済学」専攻にマップされた空のリストができました。 リストメソッド.append()を使用して、このリストに要素を追加できるようになりました。

 students_majors['Economics'].append('Alex')

students_majorsの既定の辞書に「経済学」のエントリが作成されました。

 print(students_majors)
 defaultdict(<class 'list'>, {'Economics': ['Alex']})

経済学専攻へのリスト マッピングに学生を追加したり、新しい専攻を追加したりできます。

 students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
 defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})

結論

このチュートリアルが、Python でdefaultdictをいつ、どのように使用する必要があるかを理解するのに役立つことを願っています。 このチュートリアルのコード例を実行した後、必要に応じてプロジェクトの優先データ構造として defaultdict を使用してみてください。

このチュートリアルで学んだことの要約を次に示します。

  • Python 辞書を操作していると、KeyError に遭遇することがよくあります。
  • このような KeyErrors を処理するには、いくつかの冗長メソッドを使用できます。 条件ステートメント、try-except ブロック、または .get() メソッドを使用できます。 しかし、collections モジュールの defaultdict データ型は、この KeyError 処理を簡素化できます。
  • default_factoryが有効な callable であるdefaultdict(default_factory)を使用できます。
  • キーが defaultdict に存在しない場合、デフォルト値 ( default_factoryから推測) とキーが defaultdict に追加されます。

次に、Python map 関数のチュートリアルを確認してください。