Python OrderedDict

Python学習【365日チャレンジ!】282日目のマスターU(@Udemy11)です。

Youtubeの釣り動画をついつい見てしまうのですが、生きたアジを使って青物やアオリイカを釣る「飲ませ釣り」動画を見ていると、とても簡単に青物やアオリイカが釣れているので、近いうちにやりたいな~と思ったんです。

とりあえず、思い立ったが吉日ということで、夜のアジングで何匹か釣れたアジを生かしておき、次の日の昼間からのんびり「飲ませ釣り」に行ってきました。

結果は青物もアオリイカも釣れなかったのですが、全く予想していなかった人生初のヒラメが釣れて大満足。

ヒラメの刺身

ヒラメを捌くのは初めてだったので、うろこのすき引き、5枚おろし、薄造りにかなり時間がかかってしまいましたが、エンガワもきれいに取れて、大根でツマを用意して見た目もおいしくいただきました。

ヒラメは寝かせたほうがおいしくなるそうなので、何日かに分けていただこうと思います。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、辞書型データの順番を判断できるOrderedDictを学習しました。

辞書型データはPython2.7までは、保存されているkey-valueの順序は保持されていませんでしたので、順序が関係したデータの扱いは、OrderedDictを使う必要がありました。

Python3.7以降は正式に辞書型データでもkey-valueの順序を保持するようになりましたが、入っている複数のkey-valueが同じ2つの辞書型データで、順序を判断するには、OrderedDictを使う必要がありました。

くわしくは昨日の記事をごらんください。

今日は、OrderedDictの使い方を学習します。

key順で並べ替え

OederedDictを使って並び替えや値の追加を試してみます。
まずは、keyを基準にソートします。

import collections

d = {'orange': 4, 'apple': 6, 'pear': 1}

od1 = collections.OrderedDict(
    sorted(d.items(), key=lambda  t: t[0]))
print(od1)

出力結果

OrderedDict([('apple', 6), ('orange', 4), ('pear', 1)])

辞書型データのdに入れた値をsorted()lambdaを使ってkeyのアルファベット順に出力しています。

6行目のコードの最後のt[0]keyを基準にすることを指定しています。

value順で並び替え

keyで並び替えたので、次は、valueの値で並び替えて出力しています。

od2 = collections.OrderedDict(
    sorted(d.items(), key=lambda  t: t[1]))
print(od2)

出力結果

OrderedDict([('pear', 1), ('orange', 4), ('apple', 6)])

結果を見るとわかりますが、valueの数字が小さい数順に並べ替えられています。

6行目の最後のt[1]keyを基準にすることを指定しています。

長さ順で並び替え

次に、keyの長さ順で並び替えます。

od3 = collections.OrderedDict(
    sorted(d.items(), key=lambda  t: len(t[0])))
print(od3)

出力結果

OrderedDict([('pear', 1), ('apple', 6), ('orange', 4)])

6行目のlen(t[0])keyの長さを基準にしています。

新しい値を追加

最後に新しい値を追加するときはどうなるのかチェックしてみます。

od4 = collections.OrderedDict(d)
od4['cc'] = 100
print(od4)

出力結果

OrderedDict([('orange', 4), ('apple', 6), ('pear', 1), ('cc', 100)])

6行目でkey='cc'value=100を追加して、7行目で出力しています。

出力結果を見ると、値が最後に追加されているので、もし並べ替えたあとに値を追加した場合は、もう一度、ソートの処理を実行しないと追加した値が最後に追加されたままになります。

まとめ

値の順番を保持するOrderedDictの並び替えや追加について学習しましたが、dictもPython3.7から順番を保持するようになったので、実はOrderedDictを使わなくてもdictで同じことができます。

import collections

d = {'orange': 4, 'apple': 6, 'pear': 1}

print(sorted(d.items()))
print(sorted(d.items(), key=lambda t: t[1]))
print(sorted(d.items(), key=lambda t: len(t[0])))
d['aaa'] = 100
print(d)

出力結果

[('apple', 6), ('orange', 4), ('pear', 1)]
[('pear', 1), ('orange', 4), ('apple', 6)]
[('pear', 1), ('apple', 6), ('orange', 4)]
{'orange': 4, 'apple': 6, 'pear': 1, 'aaa': 100}

出力結果は先頭にOrderedDictがないだけで、値は順番を保持した出力になっています。

辞書型でできるならOrderedDictはいらないんじゃない?と思う私ですが、Pythonのバージョンが上がるにつれて、どんどん便利になっているので、もしかしたらOrderedDictはなくなってしまうかもしれません。

OrderedDictdictの違いは、いろいろあるとは思いますが、私は2つのデータが順番も含めて値が同じかどうかを判断できるかどうかというところしかしらないので、この比較の必要がなくなれば、OrderedDictがなくなってしまうのかもしれませんね。

それでは、明日もGood Python!