見出し画像

Python基礎2: 辞書型(Dict型)

概要

Pythonの辞書(Dict)に関する内容です。一般的な操作を記載しました。


1.辞書型のイメージ

辞書は指定した値(以下:Key)を入れるとKeyに応じた別の値(Value)を返してくれます。リストと異なり基本的には入力の順序は記憶しておりません。

dict説明1

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つです。

①辞書[key]:一般的な方法です。keyがないとエラーが出ます。
②辞書.get(key):①で困る(エラーを出したくない)時に使います。

[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文を使用して値を抽出できます。

【各要素の抽出方法】
●keyのみ取得:辞書をそのまま渡す
●valueのみ取得:辞書.values()
●key・value両方取得する:辞書.items()

[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'

 初期化の手間を省く場合はdefaultdictPython標準ライブラリを使用します。下記により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

あとがき

 少しずつ修正中。

この記事が気に入ったらサポートをしてみませんか?