Python 辞書型 (連想配列

スポンサーリンク
スポンサーリンク

特徴

  • 異なるデータ型の要素を格納可能
  • 長さ(要素数)が可変
  • 要素の書き換えが可能
  • インデックス(番号)で要素にアクセスは不可
  • スライスが可能
  • 二次元、多次元配列が可能

初期設定

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(data["Tokyo"]) # 1と表示される

# 二次元配列
data = {"Tokyo":{"tel":"03"}, "Osaka":{"tel":"06"}, "Kyoto":{"tel":"075"}}
print(data["Tokyo"]) # {'tel': '03'}と表示される
print(data["Tokyo"]["tel"]) # {'tel': '03'}と表示される

二次元配列が見にくい場合は以下のように改行しても良いですよ。

data = {
    "Tokyo":{
        "tel":"03"
    }, 
    "Osaka":{
        "tel":"06"
    }, 
    "Kyoto":{
        "tel":"075"
    }
}

値の取得

キーで値を取得

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(data["Tokyo"]) 
# 1

# 二次元配列
data = {"Tokyo":{"tel":"03"}, "Osaka":{"tel":"06"}, "Kyoto":{"tel":"075"}}
print(data["Tokyo"]) 
# {'tel': '03'}
print(data["Tokyo"]["tel"]) 
# {'tel': '03'}

getで値を取得

.get(キー)で値を取得すると、存在しないキーをした場合にエラーにならずに、Noneを返します。

また、.get(キー, 返値)と第2引数を指定すれば、存在しない場合の返値を指定することもできます。

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}

print(data.get("Tokyo"))
# 1

print(data.get("Fukuoka"))
# None

print(data.get("Fukuoka", False))
# False

print(data.get("Fukuoka", "aaa"))
# aaa

キーと値の一覧を取得

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}

# キーを取得
print(data.keys())
# dict_keys(['Tokyo', 'Osaka', 'Kyoto'])

# 以下のようにリスト型に変換するとデータを取得できる
aaa = list(data.keys())
print(aaa[0])
# Tokyo

# 値を取得
print(data.values())
# dict_values([1, 2, 3])

# 以下のようにリスト型に変換するとデータを取得できる
aaa = list(data.values())
print(aaa[0])
# 1
keysやvaluesを使ってFor文のループを作成することもできる。

値の変更

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
data["Tokyo"] = 4
print(data["Tokyo"]) # 4となる。

# 以下のように書くこともできる
data.update(Tokyo=5)
print(data["Tokyo"]) # 4となる。

# まとめて更新
data.update(Tokyo=6, Osaka=7, Kyoto=8)
print(data["Tokyo"]) # 6となる。

data = {"Tokyo":{"tel":"03"}, "Osaka":{"tel":"06"}, "Kyoto":{"tel":"075"}}
data["Tokyo"]["tel"] = "04"
print(data["Tokyo"]["tel"]) # 04となる。

# 以下のように書くこともできる
data["Tokyo"] = {"tel":"05"}
print(data["Tokyo"]["tel"]) # 05となる。
更新でupdateは使う場合は一括で更新と覚えればいいかと思いますよ。
要素のキー名を変更する場合は、一旦要素を削除してから追加するしか方法はないです。

追加

末尾に追加

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
data.update(Fukuoka=4)
print(data["Fukuoka"]) # 4となる。
ここもupdateです。

指定の位置に追加(挿入)

私の知る限り不可能。

結合

data_a = {"Tokyo":1, "Osaka":2, "Kyoto":3}
data_b = {"Fukuoka":4, "Sendai":5, "Sapporo":6}
data_a.update(data_b)
print(data_a) # {'Tokyo': 1, 'Osaka': 2, 'Kyoto': 3, 'Fukuoka': 4, 'Sendai': 5, 'Sapporo': 6}となる。
ここでもupdateです。

指定位置に結合(スライスを使う

私の知る限り不可能。

削除

キーを指定して削除

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
data.pop("Tokyo")
print(data) # {'Osaka': 2, 'Kyoto': 3}となる。

# 以下のようにすると削除した要素の値を取得できる。
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
city = data.pop("Tokyo")
print(data) # {'Osaka': 2, 'Kyoto': 3}となる。
print(city) # 1となる。

一括(複数個)で削除

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
del data["Tokyo"], data["Osaka"]
print(data) # {'Kyoto': 3}となる。

# delは以下のように一つでも削除できます。
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
del data["Tokyo"]
print(data) # {'Osaka': 2, 'Kyoto': 3}となる。

キーと値の有無

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}

# 要素の有無
print('Tokyo' in data) # Trueとなる。
# 値の有無
print(1 in data.values()) # Trueとなる。
私の知っている限りでは、簡単にはLIKE検索ができません。

個数

全ての要素数

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(len(data)) # 3となる
リストなどと同じです。

指定した値と同じ値を持つ要素数

data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(list(data.values()).count(1)) # 1となる
普通の方法ではありません。少し強引ですが、配列の値をリスト型に変換してから数をカウントするしかないかと思います。

合計・最大値・最小値を取得

.values()を使用することにより、値の合計や最大値、最小値を取得することができます。

  • 合計:sum(data.values())
  • 最大値:max(data.values())
  • 最小値:min(data.values())
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}

print(sum(data.values()))
# 6

print(max(data.values()))
# 3

print(min(data.values()))
# 1

位置を取得

私の知る限りないかと思います。連想配列で、かつインデックス(番号)で要素にアクセスできないので位置の取得は意味がないかと。。。

ソート(データの順番を変更)

キーによるソートで、キーだけを抽出

dara_new = sorted(data, reverse=True)

  • dataが辞書型データになります。
  • dara_newはソートされた新たなリスト型データになります。
  • 元のデータはソートされません
  • reverseTrueで降順、Falseで昇順になります。デフォルトはFalse
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(data)
# {'Tokyo': 1, 'Osaka': 2, 'Kyoto': 3}

print(data.keys())
# dict_keys(['Tokyo', 'Osaka', 'Kyoto'])

dara_new = sorted(data)
print(dara_new)
# ['Kyoto', 'Osaka', 'Tokyo']

dara_new = sorted(data, reverse=True)
print(dara_new)
# ['Tokyo', 'Osaka', 'Kyoto']

値によるソートで、値だけを抽出

dara_new = sorted(data.values(), reverse=True)

  • dataが辞書型データになります。
  • data.values()と値を抽出します。
  • dara_newはソートされた新たなリスト型データになります。
  • 元のデータはソートされません
  • reverseTrueで降順、Falseで昇順になります。デフォルトはFalse
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(data)
# {'Tokyo': 1, 'Osaka': 2, 'Kyoto': 3}

print(data.values())
# dict_values([1, 2, 3])

dara_new = sorted(data.values())
print(dara_new)
# [1, 2, 3]

dara_new = sorted(data.values(), reverse=True)
print(dara_new)
# [3, 2, 1]

キーによるソートで、キーと値を抽出

dara_new = sorted(data.items(), reverse=True)

  • dataが辞書型データになります。
  • data.items()とキーと値を抽出します。
  • dara_newはソートされた新たなリスト型データになります。
  • 元のデータはソートされません
  • reverseTrueで降順、Falseで昇順になります。デフォルトはFalse
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(data)
# {'Tokyo': 1, 'Osaka': 2, 'Kyoto': 3}

print(data.items())
# dict_items([('Tokyo', 1), ('Osaka', 2), ('Kyoto', 3)])
dara_new = sorted(data.items())
print(data)
# [('Kyoto', 3), ('Osaka', 2), ('Tokyo', 1)]

print(dara_new)
# ['Kyoto', 'Osaka', 'Tokyo']

dara_new = sorted(data.items(), reverse=True)
print(data)
# {'Tokyo': 1, 'Osaka': 2, 'Kyoto': 3}

print(dara_new)
# [('Tokyo', 1), ('Osaka', 2), ('Kyoto', 3)]

キーまたは値によるソートで、キーと値を抽出

dara_new = sorted(data.items(), key = lambda x : x[0], reverse=True)

  • dataが辞書型データになります。
  • data.items()とキーと値を抽出します。
  • dara_newはソートされた新たなリスト型データになります。
  • 元のデータはソートされません
  • key = lambda x : x[0]でソートのキーを選択します。
    • [0]:キー
    • [1]:値
  • reverseTrueで降順、Falseで昇順になります。デフォルトはFalse
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
print(data)
# {'Tokyo': 1, 'Osaka': 2, 'Kyoto': 3}

dara_new = sorted(data.items(), key = lambda x : x[0])
print(dara_new)
# [('Kyoto', 3), ('Osaka', 2), ('Tokyo', 1)]

dara_new = sorted(data.items(), key = lambda x : x[1])
print(dara_new)
# [('Tokyo', 1), ('Osaka', 2), ('Kyoto', 3)]

dara_new = sorted(data.items(), key = lambda x : x[0], reverse=True)
print(dara_new)
# [('Tokyo', 1), ('Osaka', 2), ('Kyoto', 3)]

dara_new = sorted(data.items(), key = lambda x : x[1], reverse=True)
print(dara_new)
# [('Kyoto', 3), ('Osaka', 2), ('Tokyo', 1)]

辞書型の配列を整える(見やすく表示させる)

標準モジュールのpprintを使用します。標準モジュールですのでインストールは不要ですが、インポートは必要です。

import pprint

pprint.pprint(辞書型配列)

import pprint

data = {"Tokyo":{"code":13, "tel":"03"}, "Osaka":{"code":27, "tel":"06"}, "Kyoto":{"code":26, "tel":"075"}}

print(data)
# {'Tokyo': {'code': 13, 'tel': '03'}, 'Osaka': {'code': 27, 'tel': '06'}, 'Kyoto': {'code': 26, 'tel': '075'}}

pprint.pprint(data)
# {'Kyoto': {'code': 26, 'tel': '075'},
#  'Osaka': {'code': 27, 'tel': '06'},
#  'Tokyo': {'code': 13, 'tel': '03'}}
勝手にソートされます。
ソートを回避するには、Pythonのバージョン3.8以上sort_dicts = Falseと指定する必要があります。
タイトルとURLをコピーしました