このチュートリアルでは、Python 辞書を操作するときに KeyError をより適切に処理するために、Python のコレクション モジュールから defaultdict を使用する方法を学びます。
Python では、辞書はデータをキーと値のペアで保存する強力な組み込みデータ構造です。キーを使用して辞書をタップし、値にアクセスします。
ただし、コードの実行中に変更される Python スクリプト内に複数の辞書がある場合、多くの場合 KeyError が発生します。そして、それらに対処できる方法がいくつかあります。
このチュートリアルでは、次のことを学習します。
- KeyError とは何か、およびそれが発生する理由
- KeyError の処理方法
- Python の defaultdict (組み込み dict クラスから継承するサブクラス) を使用して、欠落しているキーをより適切に処理する方法
さぁ、始めよう!
Python の KeyError とは何ですか?
Python 辞書を定義するときは、次の点に注意する必要があります。
- キーは重複せずに一意である必要があります。
- 既存の反復可能オブジェクトを辞書のキーとして使用する場合は、タプルなどの不変コレクションを使用することをお勧めします。
したがって、キーは辞書に存在する場合にのみ有効です。それ以外の場合は KeyError が発生します。
次の辞書
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 で KeyError をどのように処理するのでしょうか?
これを行うにはいくつかの方法があります。次のセクションで説明します。
Python で KeyError を処理する方法
以下を使用して KeyError を処理する方法を学びましょう。
- If-else 条件文
- Try-Except ブロック
-
辞書メソッド
.get()
#1. If-Else 条件文の使用
Python で KeyError を処理する最も簡単な方法の 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 ステートメントの使用
KeyError を処理するもう 1 つの一般的な方法は、Python の try-exc ステートメントを使用することです。
次のコード ブロックを読んでください。
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
defaultdict は、辞書 (
dict
) クラスのサブクラスです。したがって、Python 辞書の動作を継承します。さらに、不足しているキーもネイティブに処理します。
defaultdict は
、
collections
モジュール内の Python 標準ライブラリに組み込まれているコンテナ データ型です。
したがって、それを作業環境にインポートする必要があります。
from collections import defaultdict
以下は、
defaultdict
使用するための一般的な構文です。
defaultdict(default_factory)
int、float、list などの呼び出し可能オブジェクトを
default_factory
属性として指定できます。
default_factory
の値を指定しない場合、デフォルトの
None
になります。
探しているキーが存在しない場合、
__missing__()
メソッドがトリガーされ、
default_factory
からデフォルト値が推測されます。その後、このデフォルト値を返します。
要約すれば:
-
Python では、キーが存在しない場合、
defaultdictデフォルト値を返します。 - また、このキーとデフォルト値のペアがディクショナリに追加され、後で変更できるようになります。
Python の Defaultdict の例
次に、Pythonのdefaultdictがどのように機能するかを理解するために、いくつかの例をコーディングします。
デフォルトの整数値を使用した Python の Defaultdict
まず、
collections
モジュールから
defaultdict
インポートします。
from collections import defaultdict
import random
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
辞書を出力すると、新しいキー「オレンジ」がデフォルトの整数値ゼロで追加されていることがわかります。
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
リストをデフォルト値として使用する 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 に遭遇することがよくあります。
- このような KeyError を処理するには、いくつかの詳細なメソッドを使用できます。条件文、try-excel ブロック、または .get() メソッドを使用できます。ただし、コレクション モジュールの defaultdict データ型を使用すると、この KeyError 処理を簡素化できます。
- defaultdict(default_factory) を使用できます 。default_factory は 有効な呼び出し可能です。
- キーがdefaultdictに存在しない場合、デフォルト値( default_factory から推測)とキーがdefaultdictに追加されます。
次に、Python のマップ関数に関するチュートリアルを確認してください。






![2021 年に Raspberry Pi Web サーバーをセットアップする方法 [ガイド]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)





