資料構造#1(ディクシャナリー)


※Postのすべての内容は、朴相吉氏の「Pythonアルゴリズムインタビュー」で参考にしたものです.
ディクソン主義
ディックシャナリーはPythonが提供するキー/値形式データセットの資料構造である.Python 3.7+では、入力順序を保持しないでください.Python 3.6までは入力順序を保持しません.また,内部はハッシュテーブルで実現され,他の言語ではハッシュテーブルで実現されるデータ型はC++のstd::unordered_mapとJavaのHashMapである.リストにはインデックスのみが数字に指定されますが、ディック郡では、異なるタイプのキーを使用して対応する値を検索できます.ハッシュというプロセスでは、数値だけでなく、テキスト、コレクション、および不変オブジェクトをキーとして使用できます.ハッシュテーブルの利点は,入力とクエリがO(1)上で可能であることである.ディック・シャナリーの主な演算時間の複雑さと説明を見てみましょう.
•主な演算
d[key]時間複雑度:O(1)
クエリキーは値を返します.
d[key] = value時間複雑度:O(1)
キーに対応する値(value)を挿入します.
key in d時間複雑度:O(1)
dicksherneryに鍵があるかどうかを確認します.
len(d)時間複雑度:O(1)
ディクシャナリー(d)の要素数を返します.
これらの主な演算がO(1)であるデータ型は,符号化をテストする際にも非常に有用である.前述したように、従来のディクシャナは入力順序を保持していなかった.流水ライン3.7から、内部には入力順序維持機能が設けられている.しかし,符号化をテストする際にinterpreterのバージョンを特定することは困難であるため,dicksherryが当然入力順序を維持して問題を解決すると仮定するのは危険である.したがって、この場合、collectionモジュールによって提供されるOrderedDict()を使用する方法がある.これに加えて、モジュールは、デバッガ値を生成するdefaultdict()と、要素値をキーとし、その個数を値とするCounter()のような多くの機能を提供する.
•利用
-宣言
まず、ディックシャナリーは次のように宣言することができます.
>>> d1 = dict() # dict()를 이용하여 생성
>>> d2 = {} # 중괄호를 이용하여 생성
>>> d3 = {'key1':'value1', 'key2':'value2', 'key3':'value3'} # 리스트 생성과 동시에 초기화
-追加
宣言されたバイナリ・ファイルにキー/値を挿入するには、次の操作を行います.
>>> d = {'key1':'value1', 'key2':'value2', 'key3':'value3'}
>>> d
{'key1':'value1', 'key2':'value2', 'key3':'value3'}
>>> d['key4'] = 'value4'
>>> d
{'key1':'value1', 'key2':'value2', 'key3':'value3', 'key4':'value4'}
前述したように、딕셔너리이름[키] = 값の形式でキー/値を挿入することができる.
-アクセスとクエリー
クエリーはdickshernerのキーを指定することで、対応する値をクエリーできます.
>>> d = {'key1':'value1', 'key2':'value2', 'key3':'value3'}
>>> d
{'key1':'value1', 'key2':'value2', 'key3':'value3'}
>>> d['key4']
'value4'
ただし、クエリーに存在しないキーを指定すると、KeyErrorエラーが発生します.これは、以下に示すように、tryを用いて異常処理を行うことができる.
try:
	print("d[key8]")
except KeyError:
	print("The key does not exist.")
以下のforの複文により、それぞれクエリーおよび抽出することもできる.
>>> for k,v in d.items():
...		print(k,v)
...
key1 value1
key2 value2
key3 value3
key4 value4
また、身長がそのディクシャナに存在するかどうかは以下の方法で知ることができる.
>>> 'key8' in d
False
-削除
ディックシャナの特定の要素を削除するには、キーを使用してアクセスして削除できます.
>>> d = {'key1':'value1', 'key2':'value2', 'key3':'value3'}
>>> del d['key1']
>>> d
{'key2':'value2', 'key3':'value3'}
これは、以下に示すように、tryを用いて異常処理を行うこともできる.
try:
	print("d[key8]")
except KeyError:
	d['key8'] = 'value8'
•ディックシェリーモジュール
-defaultdictオブジェクト
クエリに存在しない鍵が存在する場合、defaultdictオブジェクトは、エラー値に基づいて対応する鍵のディック宣言を生成するのではなく、エラーメッセージに基づいて生成する.collections.defaultdictクラスがあります.
>>> d = collections.defaultdict(int)
>>> d['one'] = 1
>>> d['two'] = 2
>>> d
defaultdict(<class 'int'>, {'one': 1, 'two': 2})
>>> d['three'] += 3
>>> d
defaultdict(<class 'int'>, {'one': 1, 'two': 2, 'three': 3})
上記の存在しない鍵'three'に近づき、エラーメッセージは発生せず、デフォルト値0に基づいて自動的に生成および計算される.
-counterオブジェクト
偶数オブジェクトは、要素の個数を計算することによってディックシーケンスを返します.要素の値をキーとして、その要素の個数を値とするディックシーケンスを作成し、それを1回遍歴してcollection.Counterクラスを得る.また、most_common()と同様の関数も使用できます.
>>> l = [1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6]
>>> c = collections.Counter(l)
>>> c
Counter({4: 4, 2: 2, 3: 2, 6: 2, 1: 1, 5: 1})
>>> type(c)
<class 'collections.Counter'>
>>> c.most_common(4)
[(4, 4), (2, 2), (3, 2), (6, 2)]
-orderdDictオブジェクト
PythonのDickShowneryは、他の言語でハッシュテーブルを使用しているデータ型と同様に、入力順序が保たれていなかった.もちろん、Python 3.7以降は、入力順を維持するために改良されているが、実際の符号化テストでは、割り込みバージョンとは何か分からないため、ディックシーケンスをランダムに使用し、入力順が維持されるのは危険であると考えられる.従って、collections.OrderedDictにより、以下に示すように、入力順序を保持するディックバッテリを使用することができる.
>>> od = collections.OrderedDict({'1': 1, '2': 2, '3': 3})
>>> od
OrderedDict([('1', 1), ('2', 2), ('3', 3)])
>>> od['4'] = 4
>>> od
OrderedDict([('1', 1), ('2', 2), ('3', 3), ('4', 4)])