dict

辞書を作成

dictionary = {'col_1': 'A1', 'col_2': 'B1', 'col_3': 'C1'}
val = 10
dictionary = {'col_1': val}
dictionary = {}
dictionary['col_1'] = 'A1'

# {'col_1': 'A1'}

キーワード引数で作成

d = dict(k1=1, k2=2, k3=3)
print(d)

# {'k1': 1, 'k2': 2, 'k3': 3}

キー・値に相応するリストから作成

keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]

d = dict(zip(keys, values))
print(d)

# {'k1': 1, 'k2': 2, 'k3': 3}

辞書へのアクセス

単一キーで値を取得

dictionary = {'col_1': 'A1', 'col_2': 'B1', 'col_3': 'C1'}
print(dictionary['col_1'])

# A1

forループでまとめて取得

for d in dictionary.keys():
    print(d)
# col_1
# col_2
# col_3

for d in dictionary.values():
    print(d)
# A1
# B1
# C1

for d in dictionary.items():
    print(d)
# ('col_1', 'A1')
# ('col_2', 'B1')
# ('col_3', 'C1')

辞書のキー名を変更

辞書のキーが存在するか判定

dictionary = {'col_1': 'A1', 'col_2': 'B1', 'col_3': 'C1'}

if ('col_1' in dictionary.keys()) == True:
    print('exist key')

if ('A1' in dictionary.values()) == True:
    print('exist value')

辞書の多重配列

dictionary = {}
dictionary['col_1'] = {'A1': 'a'}

# {'col_1': {'A1': 'a'}}

# 値の取り出し
print(dictionary['col_1']['A1'])

# a

値にリストを持つ辞書

dictionary = {}
dictionary['col_1'] = {'A1': ['a', 'b']}

# {'col_1': {'A1': ['a', 'b']}}

# 値の取り出し
print(dictionary['col_1']['A1'][0])

# a

辞書の結合

d1 = {'k1': 1, 'k2': 2}
d2 = {'k3': 3, 'k4': 4}

d = {**d1, **d2}
print(d)

# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
  • ※同じキーを指定した場合は上書きされる。

複数の辞書を上書きせずに結合

from collections import defaultdict

s = [('itemA', 'S', 860), ('itemB', 'S', 420), ('itemA', 'M', 950)]

d = defaultdict(list)
for k, v1, v2 in s:
    d[k].append(v1)
    d[k].append(v2)

result = sorted(d.items())

print(result)
# [('itemA', ['S', 860, 'M', 950]), ('itemB', ['S', 420])]

result_dict = dict(result)
print(result_dict)
# {'itemA': ['S', 860, 'M', 950], 'itemB': ['S', 420]}

多重配列の辞書を結合

dictionary = {'Tshirt': [{'M': 590}, {'L': 640}, {'S': 440}]}

k = []
v = []

for dic in dictionary.values():
    for d in dic:
        for dk, dv in zip(d.keys(), d.values()):
            k.append(dk)
            v.append(dv)

print(k)
# ['M', 'L', 'S']
print(v)
# [590, 640, 440]

dictionary2 = dict(zip(k, v))
print(dictionary2)
# {'M': 590, 'L': 640, 'S': 440}

辞書のソート

d = {'M': 590, 'L': 640, 'S': 440}

# キーで並び替えキーのみ取得
dk = sorted(d.keys())
print(dk)
# ['L', 'M', 'S']

# キーで並び替えキーのみ取得
dv = sorted(d.values())
print(dv)
# [440, 590, 640]

# キーで並び替え
sdk = sorted(d.items(), key=lambda x:x[0])
print(sdk)
# [('L', 640), ('M', 590), ('S', 440)]

# 値で並び替え
sdv = sorted(d.items(), key=lambda x:x[1])
print(sdv)
# [('S', 440), ('M', 590), ('L', 640)]

# 値で並び替え(降順)
sdv = sorted(d.items(), key=lambda x:x[1], reverse=True)
print(sdv)
# [('L', 640), ('M', 590), ('S', 440)]

リスト内の辞書のソート

l = [
    {'reviewAverage': 3.6, 'reviewCount': 352},
    {'reviewAverage': 2.4, 'reviewCount': 164},
    {'reviewAverage': 4.2, 'reviewCount': 1257},
    {'reviewAverage': 5.0, 'reviewCount': 29},
    {'reviewAverage': 3.8, 'reviewCount': 874},
]

pprint.pprint(sorted(l, key=lambda x: x['reviewCount']))
# [{'reviewAverage': 5.0, 'reviewCount': 29},
#  {'reviewAverage': 2.4, 'reviewCount': 164},
#  {'reviewAverage': 3.6, 'reviewCount': 352},
#  {'reviewAverage': 3.8, 'reviewCount': 874},
#  {'reviewAverage': 4.2, 'reviewCount': 1257}]

pprint.pprint(sorted(l, key=lambda x: x['reviewCount'], reverse=True))
# [{'reviewAverage': 4.2, 'reviewCount': 1257},
#  {'reviewAverage': 3.8, 'reviewCount': 874},
#  {'reviewAverage': 3.6, 'reviewCount': 352},
#  {'reviewAverage': 2.4, 'reviewCount': 164},
#  {'reviewAverage': 5.0, 'reviewCount': 29}]

リスト内の重複した辞書を削除

import json

dict_list = [
    {'col_1': 'A1', 'col_2': 'B1', 'col_3': 'C1'},
    {'col_1': 'D1', 'col_2': 'B1', 'col_3': 'C1'},
    {'col_1': 'A1', 'col_2': 'B1', 'col_3': 'C1'}
]

def unique_dict(dict_list):
    return list(map(json.loads, set(map(json.dumps, dict_list))))

print(unique_dict(dict_list))
# [
# {'col_1': 'A1', 'col_2': 'B1', 'col_3': 'C1'},
# {'col_1': 'D1', 'col_2': 'B1', 'col_3': 'C1'}
# ]

リスト内辞書で特定のキーに対応する値が重複した要素を削除

  • 下記リスト内の要素 2番目・3番目は storeID の値が重複している
l = [
    {'storeID': 352, 'reviewAverage': 3.6},
    {'storeID': 164, 'reviewAverage': 2.4},
    {'storeID': 164, 'reviewAverage': 1.9},
    {'storeID': 1257, 'reviewAverage': 4.2},
    {'storeID': 29, 'reviewAverage': 5.0},
    {'storeID': 874, 'reviewAverage': 3.8},
]
  • この重複を削除したい場合、pandas のデータフレームに変換した方がシンプルに対応できる
df = pd.DataFrame(l)
df = df.drop_duplicates(subset='storeID', keep='last')
df = df.to_dict(orient='records')
pprint.pprint(df)
# [{'reviewAverage': 3.6, 'storeID': 352},
#  {'reviewAverage': 1.9, 'storeID': 164},
#  {'reviewAverage': 4.2, 'storeID': 1257},
#  {'reviewAverage': 5.0, 'storeID': 29},
#  {'reviewAverage': 3.8, 'storeID': 874}]
  • subset に対象としたい辞書のキーを記述する
  • keep=last は重複がある場合、最後の要素を残す
  • orient='records' は、元の辞書の形式に戻すために必要

見た目が辞書の文字列データを辞書型に変換

  • JavaScript のオブジェクト型の文字列を Python の辞書として使いたい時などに
  • キー・値がダブルクォーテーションで括られていれば、json.loads() でも変換はできる
    • ただ、キー・値がシングルクォーテーションで括られている場合はエラーになる
  • ast を使えば、どちらの場合でも対応できる
  • python3 文字列を辞書に変換 - Qiita
import ast

str = "{'k1': 'val1', 'k2': 'val2', 'k3': 'val3'}"
print(type(str))
# <class 'str'>

dic = ast.literal_eval(str)
print(type(dic))
# <class 'dict'>

str = '{"k1": "val1", "k2": "val2", "k3": "val3"}'
print(type(str))
# <class 'str'>

dic = ast.literal_eval(str)
print(type(dic))
# <class 'dict'>