目次
はじめに
Pythonでプログラムを書いていて、辞書に複数のvalueを持たせたい場面があると思います。この際、key:[value1, value2, ...]
とすることで解決可能ですが、リストの要素の順番を覚えておかなければなりません。これが少し不便に感じたので、リストの代わりにnamedtuple
を用いる方法をここで提案してみます。
namedtupleとは
namedtuple
とは通常のタプルの機能に加えて、インデックス以外に要素の名前でアクセスが可能なタプルです。collections.namedtuple
とtyping.NamedTuple
の2種類があります。どちらも標準ライブラリですが、typing
モジュールの方は型に厳密という違いがあります。扱う型が決まっている場合はこちらを用いた方が便利です。今回は前者の方を使っていきます。
namedtuple
について、こちらの記事に詳しく書いてありました。
namedtupleで美しいpythonを書く!(翻訳)
辞書とnamedtupleを組み合わせる
from collections import namedtuple
Fluits = namedtuple('Fluits', ['name', 'price'])
fluits = {
'001':Fluits('リンゴ', 300),
'002':Fluits('ブドウ', 1000),
#ほかのフルーツ
}
fluit = fluits['001']
print(f'{fluit.name}は{fluit.price}円です')
辞書とnamedtuple
を組み合わせることで上記のようにdictionary[key].〇〇
という風にドットアクセスが可能になります。筆者はRPGの作成で、magics['101'].MP
、 magics['101'].func
のように活用しています。使用感としては、リストを用いるよりも可読性が上がった感じがします。
ちなみにnamedtuple
は通常のタプルを継承しているため、イミュータブルなオブジェクトです。よってデータの変更はサポートしていません。筆者はプログラムを読み込んだ際に一括で設定しているため、むしろイミュータブルなオブジェクトの方が都合が良いですが、データを書き換えたい場合もあるでしょう。
その際はnamedtuple
ではなく、自作のクラスを用いれば、同じようなことが可能です。
class Fluits:
def __init__(self, name, price):
self.name = name
self.price = price
この極めて簡単な構造のクラスはミュータブルなので、namedtuple
の代わりに用いることでデータの変更に対応可能です。
まとめ
辞書のvalueにnamedtuple
を用いることで、一つのキーに対して
複数のドットアクセス可能なvalueを持たせることができ、可読性の向上が見込める。
最後に
今回は辞書に複数のvalueを持たせる方法としてリストではなくnamedtuple
を用いる方法を提案してみました。メモリ使用効率や実行速度などは考慮していないので業務で使えるかは分かりませんが、個人でプログラムを書いている分には使える方法じゃないかなと思います。