辞書を作成
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'>