3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

valueを複数持つ辞書を、より便利に作りたい

Posted at

目次

はじめに

 Pythonでプログラムを書いていて、辞書に複数のvalueを持たせたい場面があると思います。この際、key:[value1, value2, ...]とすることで解決可能ですが、リストの要素の順番を覚えておかなければなりません。これが少し不便に感じたので、リストの代わりにnamedtupleを用いる方法をここで提案してみます。

namedtupleとは

 namedtupleとは通常のタプルの機能に加えて、インデックス以外に要素の名前でアクセスが可能なタプルです。collections.namedtupletyping.NamedTupleの2種類があります。どちらも標準ライブラリですが、typingモジュールの方は型に厳密という違いがあります。扱う型が決まっている場合はこちらを用いた方が便利です。今回は前者の方を使っていきます。

namedtupleについて、こちらの記事に詳しく書いてありました。
namedtupleで美しいpythonを書く!(翻訳)

辞書とnamedtupleを組み合わせる

test.py
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'].MPmagics['101'].funcのように活用しています。使用感としては、リストを用いるよりも可読性が上がった感じがします。

 ちなみにnamedtupleは通常のタプルを継承しているため、イミュータブルなオブジェクトです。よってデータの変更はサポートしていません。筆者はプログラムを読み込んだ際に一括で設定しているため、むしろイミュータブルなオブジェクトの方が都合が良いですが、データを書き換えたい場合もあるでしょう。
 その際はnamedtupleではなく、自作のクラスを用いれば、同じようなことが可能です。

test.py
class Fluits:
    def __init__(self, name, price):
        self.name = name
        self.price = price

 この極めて簡単な構造のクラスはミュータブルなので、namedtupleの代わりに用いることでデータの変更に対応可能です。

まとめ

 辞書のvalueにnamedtupleを用いることで、一つのキーに対して
複数のドットアクセス可能なvalueを持たせることができ、可読性の向上が見込める。

最後に

 今回は辞書に複数のvalueを持たせる方法としてリストではなくnamedtupleを用いる方法を提案してみました。メモリ使用効率や実行速度などは考慮していないので業務で使えるかは分かりませんが、個人でプログラムを書いている分には使える方法じゃないかなと思います。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?