はじめに
Pythonをほとんど使ったことがなかったのですが,Pythonで辞書(dict型)を使う必要があり,少し勉強しました.
備忘録として残します.よかったらご活用します.
また,学びたてなので気になる点がございましたらご指摘いただけると幸いです.
辞書とは
雑に言うと,文字列(key)と数値(value)がセットになったもの.
Pythonドキュメントでは
辞書は キー(key): 値(value) のペアの集合であり、キーが (辞書の中で)一意でければならない
と説明されている.
辞書の生成
キーと値で生成
dic = {'key1': val1, 'key2': val2}
空の辞書の生成
dic = {}
辞書の追加
dic['key1'] = val1
コメントで教えていただいた事だが,スペース,改行区切りの文字列(str
型)と数値(int
型)を辞書に変換するために,以下のようにすることができる.
dic = {}
str1 = ["hello", "world"]
val1 = [1, 2]
dic = dict(zip(str1, val1))
辞書の値の変更
dic['key1'] = val2
辞書の出力
0
からnum
まで出力する場合は以下.
for i in range(num):
print(dic[i])
辞書を全て出力する場合は以下.
for t in dic.items():
print(t)
ソート
いろんなページを参考にしたので,参考は後述する.
keyで昇順
dic_s = sorted(dic.items())
keyで降順
降順にするためにはreverse=True
をつけると良い.
dic_s = sorted(dic.items(), reverse=True)
valueで昇順
value
でソートするためにはkey=lambda x:x[1]
をつけると良い.
dic_s = sorted(dic.items(), key=lambda x:x[1])
valueで降順
dic_s = sorted(dic.items(), reverse=True, key=lambda x:x[1])
key-valueで昇順-昇順
key-valueの両方でソートするためにはkey=lambda x:(x[1],x[0])
をつけると良い.
dic_s = sorted(dic.items(), key=lambda x:(x[1], x[0]))
key-valueで降順-降順
dic_s = sorted(dic.items(), reverse=True, key=lambda x:(x[1], x[0]))
key-valueで昇順-降順
これは,調べてもなかなか出てこなかったので,少し上のlambda式を変更して作成した.
key-valueのソートで昇順と降順を混合するために,ここではkey=value x:(-x[1], x[0])
とした.
ソートを2回連続で使う方法もあり,そのためには後述するlist
をdict
に変換する方法が必要であった.
dic_s = sorted(dic.items(), key=lambda x:(-x[1], x[0]))
key-valueで降順-昇順
上で述べた昇順-降順ソートを反転することでできた.
dic_s = sorted(dic.items(), reverse=True, key=lambda x:(-x[1], x[0]))
ソートしてlistになってほしくない場合
以上で例に挙げた書き方では,ソート後にはlist
型になっておった.これをdict
型にするためには以下の方法がある.
dic = {k: v for (k, v) in dic_s.items()}
dic = dict(dic_s.items())
以下のようにすると,ソートと変換を同時に行うことができた.
dic = dict(sorted(dic.items()))
参考
-
https://docs.python.org/ja/3/tutorial/datastructures.html
- 辞書について全般
-
https://qiita.com/shizuma/items/40f1fe4702608db40ac3
- ソートの基本
-
https://www.headboost.jp/python-how-to-sort-dict/#23
- ラムダ式を用いたkey-valueソート
-
https://www.lifewithpython.com/2014/03/python-create-dicts-from-lists.html
- list_to_dict変換
おわりに
今回はさらっと撫でるようにしか書かなかったのですが,また使う機会があればその都度更新しようと思います.