資料構造#1(ディクシャナリー)
※Postのすべての内容は、朴相吉氏の「Pythonアルゴリズムインタビュー」で参考にしたものです.
ディクソン主義
ディックシャナリーはPythonが提供するキー/値形式データセットの資料構造である.Python 3.7+では、入力順序を保持しないでください.Python 3.6までは入力順序を保持しません.また,内部はハッシュテーブルで実現され,他の言語ではハッシュテーブルで実現されるデータ型はC++の
•主な演算
•
クエリキーは値を返します.
•
キーに対応する値(value)を挿入します.
•
dicksherneryに鍵があるかどうかを確認します.
•
ディクシャナリー(d)の要素数を返します.
これらの主な演算がO(1)であるデータ型は,符号化をテストする際にも非常に有用である.前述したように、従来のディクシャナは入力順序を保持していなかった.流水ライン3.7から、内部には入力順序維持機能が設けられている.しかし,符号化をテストする際にinterpreterのバージョンを特定することは困難であるため,dicksherryが当然入力順序を維持して問題を解決すると仮定するのは危険である.したがって、この場合、
•利用
-宣言
まず、ディックシャナリーは次のように宣言することができます.
宣言されたバイナリ・ファイルにキー/値を挿入するには、次の操作を行います.
-アクセスとクエリー
クエリーはdickshernerのキーを指定することで、対応する値をクエリーできます.
ディックシャナの特定の要素を削除するには、キーを使用してアクセスして削除できます.
-defaultdictオブジェクト
クエリに存在しない鍵が存在する場合、
-counterオブジェクト
偶数オブジェクトは、要素の個数を計算することによってディックシーケンスを返します.要素の値をキーとして、その要素の個数を値とするディックシーケンスを作成し、それを1回遍歴して
PythonのDickShowneryは、他の言語でハッシュテーブルを使用しているデータ型と同様に、入力順序が保たれていなかった.もちろん、Python 3.7以降は、入力順を維持するために改良されているが、実際の符号化テストでは、割り込みバージョンとは何か分からないため、ディックシーケンスをランダムに使用し、入力順が維持されるのは危険であると考えられる.従って、
ディクソン主義
ディックシャナリーは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)])
Reference
この問題について(資料構造#1(ディクシャナリー)), 我々は、より多くの情報をここで見つけました https://velog.io/@waldo00/자료구조-0-리스트-iau9bmolテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol