私が欲しいのは、キーの固定セットを持つデータのセットを処理できるようにすることです。すべてのキーは文字列です。データは編集されません。これは、次のような通常の辞書で実行できることを知っています。
data_a = {'key1': 'data1a', 'key2': 'data2a', 'key3': 'data3a'}
data_b = {'key1': 'data1b', 'key2': 'data2b', 'key3': 'data3b'}
data_c = {'key1': 'data1c', 'key2': 'data2c', 'key3': 'data3c'}
次のように呼び出せる必要があります。
data_a['key1'] # Returns 'data1a'
ただし、これはメモリの浪費のようです (辞書はキーを複数回保存するだけでなく、明らかに 1/3 を空のままにしておくため)、同じキーを入力し続ける必要があるため、作成するのも面倒です。私のコードで何度も何度も。また、データセット内の何かを誤って変更する危険もあります。
私の現在の解決策は、最初にキーのセットをタプルに格納してから、データもタプルとして格納することです。次のようになります。
keys = ('key1', 'key2', 'key3')
data_a = ('data1a', 'data2a', 'data3a')
data_b = ('data1b', 'data2b', 'data3b')
data_c = ('data1b', 'data2c', 'data3c')
データを取得するには、次のようにします。
data_a[keys.index('key1')] # Returns 'data1a'
次に、namedtuples と呼ばれる、必要なことを実行できるように見えるこのことについて学びました。
import collections
Data = collections.namedtuple('Data', ('key1', 'key2', 'key3'))
data_a = Data('data1a', 'data2a', 'data3a')
data_b = Data('data1b', 'data2b', 'data3b')
data_c = Data('data1b', 'data2c', 'data3c')
ただし、キーで値を単純に呼び出すことはできないようです。代わりに、キーでデータを取得するには、getattr を使用する必要がありますが、これはあまり直感的ではないようです。
getattr(data_a,'key1') # Returns 'data1a'
私の基準は、まずメモリ効率、次にパフォーマンス効率です。これらの 3 つの方法のうち、どの方法が最適でしょうか? それとも、何かが足りないので、欲しいものを手に入れるためのよりPython的なイディオムがありますか?
EDIT:最近、の存在についても学びました。これは__slots__
、キーと値のペアに対してより効率的に実行され、同じ(?)量のメモリをほとんど消費しているようです。これと同様に動作する実装は、namedtuples の適切な代替になるでしょうか?