今回は、Python Dictionary Comprehensionを使って、簡単に辞書を作成する方法を紹介します。
リスト内包と同様に、Python辞書内包は1行で指定した内容の辞書を構築します。
これにより、辞書のインスタンスを作成してから、複数のステートメントを使用して辞書にデータを入力する手間を省くことができます。
それでは、例を使って簡単に辞書を作成する方法を見てみましょう。
Pythonの基本的な辞書の理解度
例えば、英語のアルファベットとそのAscii値を対応させる{key: value}の組の辞書を作りたいとします。
そこで、my_dict['a']を呼び出すと、対応するascii値(97)を出力する必要があります。
これをアルファベット a-z に対して行ってみましょう。
Pythonのコードに慣れていない人のために説明すると、通常はこのように辞書を作成してから入力することになります。
# Create the dictionarymy_dict = {}
# Now populate itfor i in range(97, 97 + 26):
# Map character to ascii value
my_dict[chr(i)] = i
# Print the populated dictionaryprint(my_dict)
|
結果は以下の通りです。
{'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101, 'f': 102, 'g': 103, 'h': 104, 'i': 105, 'j': 106, 'k': 107, 'l': 108, 'm': 109, 'n': 110, 'o': 111, 'p': 112, 'q': 113, 'r': 114, 's': 115, 't': 116, 'u': 117, 'v': 118, 'w': 119, 'x': 120, 'y': 121, 'z': 122}
|
上記のコードでも動作しますが、Pythonの辞書理解機能を呼び出すことで、より「Pythonic」にすることができ、たった1行のコードでこれを行うことができます。
辞書理解のためのシンタックスは以下のようなものです。
my_diict = {key: func(key) for key in something}
|
あるいは
my_dict = {func(val): val for val in something} |
ここで、 something はイテラブルで、 key や val を生成します。
そして、関数 func がキーと値を対応させるか、その逆を行う。
この例では、 val が変数 i で、 func(val) が関数 chr(i) です。
これで、この例は簡略化された、しかし読みやすいコードにすることができました
my_dict = {chr(i): i for i in range(97, 97 + 26)}
print(my_dict)
|
結果は以下の通りです。
{'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101, 'f': 102, 'g': 103, 'h': 104, 'i': 105, 'j': 106, 'k': 107, 'l': 108, 'm': 109, 'n': 110, 'o': 111, 'p': 112, 'q': 113, 'r': 114, 's': 115, 't': 116, 'u': 117, 'v': 118, 'w': 119, 'x': 120, 'y': 121, 'z': 122}
|
これは前と同じ出力です! すごいでしょう?
上の例でも十分に辞書引きの威力を実感できると思いますが、もっといろいろなことができるのでしょうか?
答えはイエスで、ifやelseのような条件文も辞書の理解に含めることができます。
では、見てみましょう。
この記事もチェック:Pythonのcompile関数を使って動的にコードを生成する方法
辞書理解における条件文の使い方
ifやelse` などの条件文を使って、辞書引きを行うことができる。
最初のケースとして、if条件のみを使用する場合を考えてみましょう。
辞書引きの構文はこのようになります。
my_dict = {key: value for key in iterable if condition} |
この場合、辞書は条件が成立する反復処理可能な要素についてのみマッピングを持つことになる。
例えば、偶数整数のみを正方形に写す辞書をリストから作りたいとすると、辞書の内包を利用して次のようにすることができる。
my_list = [0, 1, 2, 3, 4, 5, 6]
my_dict = {i: i*i for i in my_list if i % 2 == 0}
print(my_dict)
|
結果は以下の通りです。
{0: 0, 2: 4, 4: 16, 6: 36} |
確かに、この辞書には偶数だけがキーとして入っていますね。
では、else条件も使って辞書引きをしてみましょう。
もし、else条件も必要なら、内包の構文を修正する必要があります。
同じキーで異なる値に対応させたい場合は、次のような構文になります。
my_dict = {key: (value1 if condition1(value) is True else value2) for key, value in something}
|
既存の辞書を使用して辞書を構築することを考えてみましょう。
新しい辞書は、値が奇数であれば0として持つ。
それ以外の場合は、前の辞書にあった古い値を持つだけです。
old_dict = {'a': 97, 'b': 98, 'c': 99, 'd': 100}
new_dict = {k: (val if val % 2 == 0 else 0) for k, val in old_dict.items()}
print(new_dict)
|
結果は以下の通りです。
{'a': 0, 'b': 98, 'c': 0, 'd': 100} |
まとめ
この記事では、Python辞書の内包を行う方法を、いくつかの例を使って学びました。
参考文献
- Python辞書に関するPythonの記事