1. ホーム
  2. Python

Python Hashmap/Dictionary 使用ガイド

2022-02-14 13:15:17
<フォーム <入力 <入力 パイソン

送信元:http://www.dotnetperls.com/dictionary-python


内蔵 辞書 リスト セット タプル 2D 配列 バイト クラス コンソール 変換 日付 重複 エラー ファイル 検索 もし ラムダ レン 地図 数学 名前付きタプル なし ランダム Re スライス ソート 分割 文字列 ストリップ サブ サブストリング タイプ 一方

辞書  辞書は、要素の検索を最適化します。それは、キーと値を関連付ける。各キーは値を持つ必要があります。辞書は多くのプログラムで使用される。
角括弧付き。  キーで値を代入してアクセスします。get()で、デフォルトの結果を指定することができます。辞書は高速です。
例を取得します。  値を取得する方法はたくさんあります。私たちは、"[" と "]"という文字を使うことができます。この方法で直接値にアクセスします。キーが見つからなければKeyError。

代わりに 1つまたは2つの引数でget()メソッドを使用することができます。これなら迷惑なエラーは発生しません。

引数1です。 get() の最初の引数は、テストするキーです。この引数は必須です。

引数2です。 get() のオプションの第二引数は、デフォルト値です。これは、キーが見つからなかった場合に返されます。

Based on: Python 3

Python program that gets values

plants = {}

# Add three key-value tuples to the dictionary.
plants["radish"] = 2
plants["squash"] = 4
plants["carrot"] = 7

# Get syntax 1.
print(plants["radish"])

# Get syntax 2.
print(plants.get("tuna"))
print(plants.get("tuna", "no tuna found"))

Output

2
None
no tuna found

取得、なし。  Pythonでは "None"はnullやnilのような特別な値です。私はNoneが好きです。私の友達です。値がないことを意味します。Get()は、辞書に値がない場合、Noneを返します。 なし

注意事項 Noneにキーを割り当てることは有効です。そのため、get() は None を返すことができるが、実際にはディクショナリに None 値が存在する。


キーエラーです。  プログラムのエラーは、あなたを苦しめるためだけにあるのではありません。プログラムの問題点を示し、より良く動作するようにするためのものです。 キーエラー
Python program that causes KeyError

lookup = {"cat": 1, "dog": 2}

# The dictionary has no fish key!
print(lookup["fish"])

Output

Traceback (most recent call last):
  File "C:\programs\file.py", line 5, in <module>
    print(lookup["fish"])
KeyError: 'fish'

インキーワード  ディクショナリーは特定のキーを含む(または含まない)場合があります。多くの場合、存在するかどうかをテストする必要がある。

真です。 このキーワードは、キーが辞書のキーと値のタプルの一部として存在する場合、1(真を意味する)を返します。

偽。 キーが存在しない場合、in-keywordは0を返し、falseを示す。これは、if文で有用です。

Python program that uses in

animals = {}
animals["monkey"] = 1
animals["tuna"] = 2
animals["giraffe"] = 4

# Use in.
if "tuna" in animals:
    print("Has tuna")
else:
    print("No tuna")

# Use in on nonexistent key.
if "elephant" in animals:
    print("Has elephant")
else:
    print("No elephant")

Output

Has tuna
No elephant

Len内蔵。  これは、辞書に含まれるキーと値のタプルの数を返します。キーと値のデータ型は関係ない。Lenはリストと文字列に対しても機能する。

注意 辞書に返される長さは、キーと値を別々に考慮するものではありません。各ペアで長さが1つずつ加算されます。

Python program that uses len on dictionary

animals = {


"parrot": 2, "fish": 6}

# Use len built-in on animals.
print("Length:", len(animals))

Output

Length: 2

<未定義


Python program that uses keys

hits = {


"home": 125, "sitemap": 27, "about": 43}
keys = hits.keys()
values = hits.values()

print("Keys:")
print(keys)
print(len(keys))

print("Values:")
print(values)
print(len(values))

Output

Keys:
dict_keys(['home', 'about', 'sitemap'])
3
Values:
dict_values([125, 43, 27])
3

レンのメモ  おさらいしておきましょう。Len() は辞書だけでなく、他のデータ型にも使えます。リストに対して作用し、その中の要素数を返します。 Len
キー、バリュー  辞書はキーを含んでいます。値を含んでいます。そして、keys() と values() メソッドを使用すると、これらの要素をリストに格納することができます。

次へ 3つのキーと値の組からなる辞書が作成される。この辞書は、ウェブサイトのページのヒットカウントを保存するために使用できる。

ビュー キーと値という名前の2つの変数を導入しています。これらはリストではありませんが、リストに変換することができます。

変換
Python program that sorts keys in dictionary

# Same as previous program.
hits = {


"home": 124, "sitemap": 26, "about": 32}

# Sort the keys from the dictionary.
keys = sorted(keys.keys())

print(keys)

Output

['about', 'home', 'sitemap']

<未定義


Python that uses the items method

rents = {


"apartment": 1000, "house": 1300}

# Convert to list of tuples.
rentItems = rents.items()

# Loop and display tuple items.
for rentItem in rentItems:
    print("Place:", rentItem[0])
    print("Cost:", rentItem[1])
    print("")

Output

Place: house
Cost: 1300

Place: apartment
Cost: 1000

キー、値の順番。  keys()、values()で返される要素は、順序付けされていません。上の出力では、keys-view はアルファベット順にソートされていません。 reading)。
ソートされたキー。  ディクショナリーでは、キーはどのような方法でも並べ替えられない。順不同である。その順序は、ハッシュアルゴリズムのバケット内部を反映している。

しかし キーの並べ替えが必要な場合があります。キーに対して別のメソッド sorted() を呼び出します。

Python error:

TypeError: 'tuple' object does not support item assignment

<未定義


Python that unpacks items

# Create a dictionary.
data = {


"a": 1, "b": 2, "c": 3}

# Loop over items and unpack each item.
for k, v in data.items():
    # Display key and value.
    print(k, v)

Output

a 1
c 3
b 2

項目  このメソッドでは、2つの要素を持つタプルのリストを受け取ります。各タプルは、その最初の要素としてキーを含んでいます。2番目の要素は値です。

ヒント タプルでは、最初の要素のインデックスを0、2番目の要素のインデックスを1としてアドレスを指定することができます。

<スパン プログラムです。 このコードでは、items()リストに対してfor-loopを使用しています。このコードでは、2つの引数を指定してprint()メソッドを使用しています。

Python that loops over dictionaries

plants = {


"radish": 2, "squash": 4, "carrot": 7}

# Loop over dictionary directly.
# ... This only accesses keys.
for plant in plants:
    print(plant)

Output

radish
carrot
squash

<未定義


Python that uses del

systems = {


"mac": 1, "windows": 5, "linux": 1}

# Remove key-value at "windows" key.
del systems["windows"]

# Display dictionary.
print(systems)

Output

{'mac': 1, 'linux': 1}

項目、割り当て。  タプル内の要素を代入することはできません。rentItem[0]やrentItem[1]を代入しようとすると、エラーになります。
Python that uses update

# First dictionary.
pets1 = {


"cat": "feline", "dog": "canine"}

# Second dictionary.
pets2 = {


"dog": "animal", "parakeet": "bird"}

# Update first dictionary with second.
pets1.update(pets2)

# Display both dictionaries.
print(pets1)
print(pets2)

Output

{'parakeet': 'bird', 'dog': 'animal', 'cat': 'feline'}
{'dog': 'animal', 'parakeet': 'bird'}

アイテム、開梱  items()リストは、別のfor-loop構文で使用することができます。items()の各タプルの2つの部分を直接for-loopの中で解凍することができるのです。

ここで この例では、キーに "k" という識別子、値に "v" という識別子を使用しています。

Python that uses copy

original = {


"box": 1, "cat": 2, "apple": 5}

# Create copy of dictionary.
modified = original.copy()

# Change copy only.
modified["cat"] = 200
modified["apple"] = 9

# Original is still the same.
print(original)
print(modified)

Output

{'box': 1, 'apple': 5, 'cat': 2}
{'box': 1, 'apple': 9, 'cat': 200}

<未定義


Python that uses fromkeys

# A list of keys.
keys = ["bird", "plant", "fish"]

# Create dictionary from keys.
d = dict.fromkeys(keys, 5)

# Display.
print(d)

Output

{'plant': 5, 'bird': 5, 'fish': 5}

For-loopです。  辞書は、for-loopで直接列挙することができる。これは、辞書のキーにのみアクセスする。値を得るには、調べる必要がある。

項目です。 items()メソッドを呼び出すと、タプルのリストを取得することができます。値にアクセスするための余分なハッシュ検索は必要ありません。

これです。 for-loopの中のplant変数がキーです。値は利用できないので、アクセスするにはplants.get(plant)が必要です。

Python that uses dict built-in

# Create list of tuple pairs.
# ... These are key-value pairs.
pairs = [("cat", "meow"), ("dog", "bark"), ("bird", "chirp")]

# Convert list to dictionary.
lookup = dict(pairs)

# Test the dictionary.
print(lookup.get("dog"))
print(len(lookup))

Output

bark
3

<未定義


Python that benchmarks get

import time

# Input dictionary.
systems = {"mac": 1, "windows": 5, "linux": 1}

# Time 1.
print(time.time())

# Get version.
i = 0
v = 0
x = 0
while i < 10000000:
    x = systems.get("windows", -1)
    if x ! = -1:
        v = x
    i += 1

# Time 2.
print(time.time())

# In version.
i = 0
v = 0
while i < 10000000:
    if "windows" in systems:
        v = systems["windows"]
    i += 1

# Time 3.
print(time.time())

Output

1345819697.257
1345819701.155 (get = 3.90 s)
1345819703.453 (in = 2.30 s)

デル組み込み。  データを削除するにはどうしたらよいのでしょうか。辞書の項目に対してdelメソッドを適用します。このプログラムでは、3つのKey-Valueタプルを持つ辞書を初期化します。 デル

では キーが "windows" のタプルを削除します。辞書を表示すると、2つのキーと値のペアが含まれているだけです。

Python that benchmarks loops

import time

data = {"michael": 1, "james": 1, "mary": 2, "dale": 5}
items = data.items()

print(time.time())

# Version 1: get.
i = 0
while i < 10000000:
    v = 0
    for key in data:
        v = data[key]
    i += 1

print(time.time())

# Version 2: items.
i = 0
while i < 10000000:
    v = 0
    for tuple in items:
        v = tuple[1]
    i += 1

print(time.time())

Output

1345602749.41
1345602764.29 (version 1 = 14.88 s)
1345602777.68 (version 2 = 13.39 s)

<未定義


Python that counts letter frequencies

# The first three letters are repeated.
letters = "abcabcdefghi"

frequencies = {}
for c in letters:
    # If no key exists, get returns the value 0.
    # ... We then add one to increase the frequency.
    # ... So we start at 1 and progress to 2 and then 3.
    frequencies[c] = frequencies.get(c, 0) + 1

for f in frequencies.items():
    # Print the tuple pair.
    print(f)

Output

('a', 2)
('c', 2)
('b', 2)
('e', 1)
('d', 1)
('g', 1)
('f', 1)
('i', 1)
('h', 1)

デル 代替品  辞書にdelを使う代わりに、キーの値を特別な値に変更する方法があります。これは、NULLオブジェクトのリファクタリング戦略である。
更新しました。  このメソッドで、1つの辞書を変更して、2つ目の辞書から新しい値を取得します。Update() は、既存の値も変更します。ここでは、2 つのディクショナリを作成します。

ペット1、ペット2 pets2の辞書では、dogキーの値が異なっており、quot;canine"ではなく、quot;animal"という値になっています。

また pets2 辞書は、新しいキーと値のペアを含んでいます。このペアのキーは "parakeet"、値は "bird"である。

結果 既存の値は、一致する新しい値で置き換えられます。一致する値が存在しない場合は、新しい値が追加されます。

Python that uses update

# First dictionary.
pets1 = {

<未定義


"cat": "feline", "dog": "canine"}

# Second dictionary.
pets2 = {

<未定義


"dog": "animal", "parakeet": "bird"}

# Update first dictionary with second.
pets1.update(pets2)

# Display both dictionaries.
print(pets1)
print(pets2)

Output

{'parakeet': 'bird', 'dog': 'animal', 'cat': 'feline'}
{'dog': 'animal', 'parakeet': 'bird'}

コピー  このメソッドは、辞書全体の浅いコピーを実行します。ディクショナリー内のすべてのキーと値のタプルがコピーされます。

ここです。 元の辞書のコピーを作成します。そして、そのコピー内の値を変更する。元の辞書は影響を受けない。

Python that uses copy

original = {

<未定義


"box": 1, "cat": 2, "apple": 5}

# Create copy of dictionary.
modified = original.copy()

# Change copy only.
modified["cat"] = 200
modified["apple"] = 9

# Original is still the same.
print(original)
print(modified)

Output

{'box': 1, 'apple': 5, 'cat': 2}
{'box': 1, 'apple': 9, 'cat': 200}

フロムキー  このメソッドは、リストのようなキーのシーケンスを受け取ります。これは、それらのキーのそれぞれを持つ辞書を作成します。第2引数として値を指定することができます。

値です。 fromdict()に第2引数を指定すると、各キーは新しく作成された辞書にその値を持つ。

Python that uses fromkeys

# A list of keys.
keys = ["bird", "plant", "fish"]

# Create dictionary from keys.
d = dict.fromkeys(keys, 5)

# Display.
print(d)

Output

{'plant': 5, 'bird': 5, 'fish': 5}

ディクショナリー  この組み込み関数により,タプルのリストから辞書を構築することができる。タプルはペアである。これらはそれぞれ、キーと値の2つの要素を持っています。

ヒント これは、ディスクから辞書を読み込む方法として考えられるものです。ペアのリストとして保存(シリアライズ)することができる。

Python that uses dict built-in

# Create list of tuple pairs.
# ... These are key-value pairs.
pairs = [("cat", "meow"), ("dog", "bark"), ("bird", "chirp")]

# Convert list to dictionary.
lookup = dict(pairs)

# Test the dictionary.
print(lookup.get("dog"))
print(len(lookup))

Output

bark
3

メモしてください。  古典的な最適化のひとつにメモ化があります。そして、これは辞書を使って簡単に実装することができます。メモ化では、関数(def)はその結果を計算する メモ化では、関数(def)はその結果を計算する。 メモライズ

そして 計算が終わると、その結果をキャッシュに保存する。キャッシュの中では、引数がキーで、結果が値となる。


メモ化、継続中。  メモライズされた関数が呼び出されると、まずこのキャッシュをチェックして、この引数で以前に実行されたことがあるかどうかを確認します。

そして もしそうなら、キャッシュされたメモ化された戻り値を返します。それ以上の計算をする必要はありません。

関数が引数で一度だけ呼ばれる場合、メモ化は何のメリットもありません。


パフォーマンスを取得します。  get()を使うループと、インキーワードと2回目のルックアップの両方を使うループを比較しました。バージョン2、"in"演算子を使った方が高速でした。

<スパン バージョン1 このバージョンでは、get()の第2引数を使用します。その結果に対してテストを行い、値が見つかれば処理を進めます。

バージョン2。 このバージョンでは、"in" を使用してからルックアップを行います。2倍のルックアップが発生する。しかし、実行される文はより少ない。

Python that benchmarks get

import time

# Input dictionary.
systems = {"mac": 1, "windows": 5, "linux": 1}

# Time 1.
print(time.time())

# Get version.
i = 0
v = 0
x = 0
while i < 10000000:
    x = systems.get("windows", -1)
    if x ! = -1:
        v = x
    i += 1

# Time 2.
print(time.time())

# In version.
i = 0
v = 0
while i < 10000000:
    if "windows" in systems:
        v = systems["windows"]
    i += 1

# Time 3.
print(time.time())

Output

1345819697.257
1345819701.155 (get = 3.90 s)
1345819703.453 (in = 2.30 s)

文字列キーの性能。  別のテストでは、文字列のキーを比較しました。長い文字列キーは短い文字列キーよりも検索に時間がかかることがわかりました。 辞書の文字列キー
パフォーマンス、ループ  辞書はさまざまな方法でループさせることができます。このベンチマークでは、2つのアプローチをテストします。各反復でキーと値にアクセスします。

<スパン バージョン1。 このバージョンでは、辞書のキーをwhileループでループしている。その後、値を取得するために追加のルックアップを行う。

バージョン2。 このバージョンでは、代わりにキーと値を含むタプルのリストが使用される。実際には、元の辞書には触れない。

しかし バージョン2も同じ効果で、キーと値にアクセスします。最初にitems()を呼び出すコストは、ここではカウントされていません。

Python that benchmarks loops

import time

data = {"michael": 1, "james": 1, "mary": 2, "dale": 5}
items = data.items()

print(time.time())

# Version 1: get.
i = 0
while i < 10000000:
    v = 0
    for key in data:
        v = data[key]
    i += 1

print(time.time())

# Version 2: items.
i = 0
while i < 10000000:
    v = 0
    for tuple in items:
        v = tuple[1]
    i += 1

print(time.time())

Output

1345602749.41
1345602764.29 (version 1 = 14.88 s)
1345602777.68 (version 2 = 13.39 s)

ベンチマーク、ループの結果。  上記で、タプルのリストに対するループは、辞書を直接ループするよりも高速であることがわかりました。これは理にかなっている。リストでは、ルックアップが行われないからである。
フリークエンシー  辞書を使って頻度を数えることができる。ここでは、いくつかの文字が繰り返される文字列を紹介する。 存在しない値。

だから 最初に文字が見つかったとき、その周波数は0 + 1、次に1 + 1に設定されます。Get() にはデフォルトの戻り値があります。

Python that counts letter frequencies

# The first three letters are repeated.
letters = "abcabcdefghi"

frequencies = {}
for c in letters:
    # If no key exists, get returns the value 0.
    # ... We then add one to increase the frequency.
    # ... So we start at 1 and progress to 2 and then 3.
    frequencies[c] = frequencies.get(c, 0) + 1

for f in frequencies.items():
    # Print the tuple pair.
    print(f)

Output

('a', 2)
('c', 2)
('b', 2)
('e', 1)
('d', 1)
('g', 1)
('f', 1)
('i', 1)
('h', 1)

要約です。  辞書は通常、ハッシュテーブルとして実装される。ここでは、特別なハッシュ・アルゴリズムがキー(多くの場合、文字列)を整数に変換する。
スピードアップのために <スパン  これにより、検索時間を短縮することができます。性能に問題のあるプログラムでは、辞書を使うことが最適化への最初の道となることが多い 性能に問題のあるプログラムでは、辞書を使うことが最適化への最初の道となることが多い