Python基礎2: 辞書型(Dict型)
概要
Pythonの辞書(Dict)に関する内容です。一般的な操作を記載しました。
1.辞書型のイメージ
辞書は指定した値(以下:Key)を入れるとKeyに応じた別の値(Value)を返してくれます。リストと異なり基本的には入力の順序は記憶しておりません。
2.辞書の作成方法
2-1.一般的な記載方法
一般的な記載方法は{Key:Value}となります。
[In]
items = {'BTC':4684348, 'ETH':317246, 'ETC':5143, 'LTC':16475, 'XRP':102.47,'BAT':69.47,'XEM':16.036}
print(items)
[Out]
{'BTC': 4684348, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036}
キーワード引数を使用した方法もあります。この場合Keyが文字列でも'や"では囲いません。
[In]
items = dict(BTC=4684348, ETH=317246, ETC=5143, LTC=16475, XRP=102.47,BAT=69.47,XEM=16.036)
print(items)
[Out]
{'BTC': 4684348, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036}
1-2.内包表記
内包表記でも記載できます。リストなどが既にある時は便利です。
[In]
list_crypto = ['BTC', 'ETH', 'ETC', 'LTC', 'XRP','BAT','XEM']
prices = [4684348, 317246, 5143, 16475, 102.47,69.47,16.036]
items = {key:value for key, value in zip(list_crypto,prices)}
print(items) #※items['BTC']としたら上記と同じ値を出力できます。
[Out]
{'BTC': 4684348, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036}
[In]
import string
words = string.ascii_lowercase #出力:'abcdefghijklmnopqrstuvwxyz'
nums_words = list(range(26)) #アルファベットと同じ数のリスト[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
idtowords = {k:v for k, v in zip(words, nums_words)}
print(idtowords)
[Out]
{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14, 'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}
私は使いませんがdict()内に内包表記っぽく書けますのでご参考までに。
[In]
list_crypto = ['BTC', 'ETH', 'ETC', 'LTC', 'XRP','BAT','XEM']
prices = [4684348, 317246, 5143, 16475, 102.47,69.47,16.036]
dict((key, value) for key, value in zip(list_crypto,prices))
[Out]
{'BTC': 4684348, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036}
3.辞書内データの抽出
3-1.個別抽出
辞書からデータを抽出する一般的な方法は以下2つです。
[In]
items = {'BTC':4684348, 'ETH':317246, 'ETC':5143, 'LTC':16475, 'XRP':102.47,'BAT':69.47,'XEM':16.036}
print(items['BTC'])
print(items.get('XEM'))
print(items.get('DOGE')) #辞書には存在しないkey
[Out]
4684348
16.036
None
3-2.一括抽出:key, values, items
辞書はイテラブルでありfor文を使用して値を抽出できます。
[In1] キーのみ出力
items = {'BTC':4684348, 'ETH':317246, 'ETC':5143, 'LTC':16475, 'XRP':102.47,'BAT':69.47,'XEM':16.036}
for key in items:
print(key)
[Out1]
BTC ETH ETC LTC XRP BAT XEM
[In2] 値のみ出力
for value in items.values():
print(value)
[Out2]
4684348 317246 5143 16475 102.47 69.47 16.036
[In3] キーと値を出力
for key, value in items.items():
print(key, value)
[Out3]
BTC 4684348
ETH 317246
ETC 5143
LTC 16475
XRP 102.47
BAT 69.47
XEM 16.036
4.データの追加・更新・削除
4-1.個別処理
データの追加・更新・削除は下記のとおりです。
[In]
items = {'BTC':4684348, 'ETH':317246, 'ETC':5143, 'LTC':16475, 'XRP':102.47,'BAT':69.47,'XEM':16.036}
items['BTC'] = 5000000 #データの更新
print(items)
items['MONA'] = 149.700 #データの追加
print(items)
items.pop('BAT') #データの削除
print(items)
[Out]
{'BTC': 5000000, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036}
{'BTC': 5000000, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036, 'MONA': 149.7}
{'BTC': 5000000, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'XEM': 16.036, 'MONA': 149.7}
4-2.一括でデータ追加:update()
特定の辞書を別の辞書に丸ごと追加する場合はupdate()を使用します。
[In]
items1 = {'BTC':4684348, 'ETH':317246, 'ETC':5143}
items2 = {'LTC':16475, 'XRP':102.47,'BAT':69.47,'XEM':16.036}
items1.update(items2)
print(items1)
[Out]
{'BTC': 4684348, 'ETH': 317246, 'ETC': 5143, 'LTC': 16475, 'XRP': 102.47, 'BAT': 69.47, 'XEM': 16.036}
なお更新する辞書内に同じKeyがあると追加側のデータに更新されます。
[In]
items1 = {'BTC':4684348, 'ETH':317246, 'ETC':5143}
items2 = {'BTC':16475, 'XRP':102.47}
items1.update(items2)
print(items1)
[Out] ※4684348が上書きされた
{'BTC': 16475, 'ETH': 317246, 'ETC': 5143, 'XRP': 102.47}
5.ソート
5-1.入力順序を記憶(collections)
辞書に入力した順番を覚えさせたい場合はOrderedDictを使用します。
(※多分python3.6以上だとデフォルトで順序が保持されているはず・・)
[In]
from collections import OrderedDict
d = OrderedDict()
words = string.ascii_lowercase #出力:'abcdefghijklmnopqrstuvwxyz'
nums_words = list(range(26))
for key, value in zip(words, nums_words):
d[key]=value
d
[Out]
OrderedDict([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6), ('h', 7), ('i', 8), ('j', 9), ('k', 10), ('l', 11), ('m', 12), ('n', 13), ('o', 14), ('p', 15), ('q', 16), ('r', 17), ('s', 18), ('t', 19), ('u', 20), ('v', 21), ('w', 22), ('x', 23), ('y', 24), ('z', 25)])
5-2.KeyとValueの入れ替え
items()+内包表記を組み合わせるとkeyとvalueを入れ替えができます。
[In]
wordstoid = {v:k for k, v in idtowords.items()} #idtowords=alphabet:idの辞書※上記で作成
wordstoid
[Out]
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z'}
6.特殊な辞書の作成:defalutdict
辞書はKeyが存在しないとエラーが出ます。よって使用する場合はすべての要素を初期化する必要があります。
[In]
crypto_items = {}
crypto_items['BTC']
[Out]
KeyError: 'BTC'
初期化の手間を省く場合はdefaultdictを使用します。下記によりKeyがない場合は初期値0が自動で入ります(lambdaは下記参照)。
[In]
from collections import defaultdict
crypto_items = defaultdict(lambda: 0)
crypto_items['BTC']
[Out]
0
【参考】JSONファイル
プログラミングでよく聞くJSONファイルですが、中身はほぼ辞書です。記法は下記の通り"である必要があります。
{
"consumer_key":"xxxx",
"consumer_secret":"yyyy",
"access_token":"zzzz",
"access_token_secret":"tttt"
}
※JSONは正確には文字列ですが初心者の時は”=辞書”で問題ないです。
[In]
import json
info = {
"name": "KIYO",
"age": "100",
"site": "note"
}
type(info) #->dict型
type(json.dumps(info)) #->str型
[Out]
dict
str
あとがき
少しずつ修正中。