Lesson 11
辞書
1. 辞書
通常のリスト(配列)は、通常、番号付きの要素のセットです。したがって、リスト項目を参照する場合は、番号を指定する必要があります。リスト内の要素の数は、アイテム自体を一意に識別します。しかし、識別番号は必ずしも便利ではありません。たとえば、ロシアの列車のルートでは、識別コード(数字と1桁)として文字と数字を使用します。数字のアルファベットコードはフライトを識別します。つまり、フライト、列車または航空機IDに関する情報は数字ではなく、テキスト文字列。
数値の代わりに任意のタイプのインデックスを使用できるデータ構造は、 辞書または連想配列と呼ばれます。 Pythonの対応するデータ構造はdict
と呼ばれます。
簡単な例を考えてみましょう。辞書のCapitals
取得します。ここで、indexは国の名前であり、value - この国の首都の名前です。今や国の名前の列があれば、私たちは容易に首都を識別することができます。
# 空のdict大文字を作成する Capitals = dict() # いくつかの値を入力してください Capitals['Russia'] = 'Moscow' Capitals['Ukraine'] = 'Kiev' Capitals['USA'] = 'Washington' Countries = ['Russia', 'France', 'USA', 'Russia'] for country in Countries: # リストから各国のためにそれが辞書にあるかどうかを確認する首都 if country in Capitals: print('The capital of ' + country + ' is ' + Capitals[country]) else: print('The capital of ' + country + ' is unknown')
したがって、辞書の各要素は、 キーと値の 2つのオブジェクトで構成されています 。この例では、キーは国名であり、値は資本の名前です。キーは辞書の要素を識別し、値は指定されたキーに対応するデータです。キーの値は一意です。つまり、辞書には2つの同一のキーが存在することはできません。
私たちは、私たちの周りの辞書、通常の紙辞書(定義、単一言語、バイリンガル)に慣れています。辞書を定義するために、キーは単語(記事のタイトル)であり、値は記事自体であり、記事にアクセスするには単語キーを指定する必要があります。
電話帳は、辞書データ構造の別の例である。この場合、キーは名前であり、値は電話番号です。辞書と電話帳の両方について、あるキーで辞書の要素を見つけるのは簡単です(レコードがキーのアルファベット順に格納されている場合、バイナリ検索で簡単にキーを見つけることができます)が、指定された値を持つ要素の検索では、辞書のすべての要素の一貫性のあるビューが必要な場合があります。
連想配列の重要な特徴は、それが動的であることです。すなわち、任意のキーで新しい要素を追加し、既存の要素を削除することができます。使用されるメモリの量は、連想配列のサイズに比例します。連想配列の要素へのアクセスは普通の配列よりも遅くなりますが、かなり早くです。
Pythonでは、キーは、不変(変更不可)なデータ型(整数と実数、文字列、タプル)を使用できます。辞書内のキーは設定されないかもしれないが、型の素子であってもよいfrozenset
:型の特殊なデータ型アナログset
作成後に変更することができません。辞書要素の値は、変更可能な任意のデータ型にすることができます。
2. 辞書の適用
辞書は、以下の場合に使用されます。
Num['January'] = 1; Num['February'] = 2; ...
を使用してそれを行うことができますNum['January'] = 1; Num['February'] = 2; ...
空の辞書は、関数dict()
または空の中括弧{}
ペアを使って作成することができます(これは、中括弧を使用して空集合を作成することができない理由です)。いくつかの初期値を持つ辞書を作成するには、以下の構造を使用できます。
Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'} Capitals = dict(RA = 'Moscow', Ukraine = 'Kiev', USA = 'Washington') Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")]) Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"])) print(Capitals)
最初の2つの方法は、すべての要素をリストすることによって小さな辞書を作成するためにのみ使用できます。さらに、第2の方法では、キーはdict
名前付きパラメータとして渡されるので、この場合、キーは文字列のみであり、正しい識別子のみである可能性があります。 3番目と4番目のケースでは、転送された引数がすべての要素をリストするだけでなく、プログラムの実行中に他の方法で構築された既製のリストである場合、大きな辞書を作成できます。 3番目の方法では、関数dict
は各要素がkeyとvalueの2つの要素のタプルであるリストを受け取る必要があります。 4番目の方法では、同じ長さの2つのリスト、キーのリストと値のリストを受け取る必要がある関数zip
使用します。
3. 辞書項目の操作
基本操作:キーで要素の値を取得する。リストとまったく同じように書かれています: A[key]
。指定されたキーを持つ要素が辞書にない場合、例外KeyError
が発生しKeyError
。
キーに基づいて値を定義する別の方法は、メソッドget
: A.get(key)
です。キーでどの要素が存在しない場合get
辞書では、それは返しませんNone
。 2つの引数を持つ形式A.get(key, val)
メソッドは、キーのkey
持つ要素が辞書にない場合、 val
返します。
要素がディクショナリに属しているかどうかをチェックするには、 in
とnot in
が使われます。これはsetと同じです。
新しい項目を辞書に追加するには、値を割り当てるだけA[key] = value
。 A[key] = value
。
辞書から項目を削除するには、 del A[key]
使用します(辞書にそのようなキーがない場合、操作でKeyError
例外が発生します)。辞書から項目を削除する2つの安全な方法があります。
A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'} key = 'ac' if key in A: del A[key] try: del A[key] except KeyError: print('There is no element with key "' + key + '" in dict') print(A)
最初のケースでは、要素の存在を事前にチェックしてから例外を捕捉して処理します。
辞書から項目を削除する別の方法は、 pop
というメソッドですA.pop(key)
。このメソッドは、削除された要素の値を返します。指定されたキーを持つ要素がディクショナリにない場合は、例外が発生します。メソッドpop
が、欠落している要素よりも第2のパラメータを受け取った場合、このパラメータの値を返します。これにより、辞書からの要素の削除を安全に整理することができますA.pop(key, None)
4. 反復辞書
辞書内のすべての項目のキーを簡単に反復することができます。
A = dict(zip('abcdef', list(range(6)))) for key in A: print(key, A[key])
次のメソッドは、辞書の要素の表現を返します。表現は集合に似ていますが、要素の値を変更すると変わります。メソッドkeys
はすべての要素のキーの表現を返し、 values
はすべての値の表現を返し、メソッドitems
はキーと値のすべてのペア(タプル)の表現を返します。
したがって、値val
が辞書A
すべての値の中にあるかどうかを素早く確認するにはval in A.values()
boolean condition val in A.values()
を使用する必要があります。キーと変数をループするには、次の操作を行います。
A = dict(zip('abcdef', list(range(6)))) for key, val in A.items(): print(key, val)