Pythonのdict型をソートすると返り値がlist型になってしまう問題について
今回はPythonのdict型をソートすると返り値がlist型になってしまう問題について、どう対処すべきかについてご紹介いたします。
動作確認しているのはPython3です。
Pythonのdict型をソートすると返り値がlist型になってしまう問題について
例として、次のようなプログラムがあったとします。
1 2 3 4 5 6 7 8 9 10 11 12 |
num_eng = {'5': 'five', '1': 'one', '7': 'seven', '3': 'three'} print('') print(num_eng) print(type(num_eng)) sorted_num_eng = sorted(num_eng.items()) print('') print(sorted_num_eng) print(type(sorted_num_eng)) |
最初にdict型のnum_engを定義してsortを行い、sorted_num_engにソートした結果を格納しています。
こちらのプログラムの実行結果は次のようになります。
1 2 3 4 5 |
{'5': 'five', '1': 'one', '7': 'seven', '3': 'three'} <class 'dict'> [('1', 'one'), ('3', 'three'), ('5', 'five'), ('7', 'seven')] <class 'list'> |
出力結果から分かる通り、dict型のオブジェクトをソートしようとするとlist型で返ってきてしまうのが分かりますね。
単にlist型の返り値を次のようにdictで囲ってしまうとうまくいかない時があります。(なぜか私の環境では再現できませんでした。ひとまず上手くいかないときがあります。バージョンの違い?)
1 |
sorted_num_eng = dict(sorted_num_eng) |
そんなときの対処法として、OrderedDictを使うという方法があります。
OrderedDictは順序を保持するdictです。
通常のdict型のオブジェクトでは順序は保持できませんが、OrderedDictを使用することで順序を保持したままdictを扱うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from collections import OrderedDict num_eng = {'5': 'five', '1': 'one', '7': 'seven', '3': 'three'} print('') print(num_eng) print(type(num_eng)) sorted_num_eng = sorted(num_eng.items()) print('') print(sorted_num_eng) print(type(sorted_num_eng)) sorted_num_eng = OrderedDict(sorted_num_eng) print('') print(sorted_num_eng) print(type(sorted_num_eng)) print(sorted_num_eng['5']) |
実行結果は次の通りです。
1 2 3 4 5 6 7 8 9 |
{'5': 'five', '1': 'one', '7': 'seven', '3': 'three'} <class 'dict'> [('1', 'one'), ('3', 'three'), ('5', 'five'), ('7', 'seven')] <class 'list'> OrderedDict([('1', 'one'), ('3', 'three'), ('5', 'five'), ('7', 'seven')]) <class 'collections.OrderedDict'> five |
終わりに
今回はPythonのdict型をソートすると返り値がlist型になってしまう問題についての対処法についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません