Michaelが提案するような辞書を使用するか(ただし、 v
withの内容にアクセスする必要がありますが、これは少し面倒です)、 C ++の構造体v['a']
に相当するものを使用できます:名前付きタプル:
import collections
node = collections.namedtuple('node', 'a b c d')
# Tom = ...
v = node(Tom, 100, 3.14, {'x':1, 'y':2, 'z':3})
print node # node(a=…, b=100, c=3.14, d={'x':1, 'y':2, 'z':3})
print node.c # 3.14
print node[2] # 3.14 (works too, but is less meaningful and robust than something like node.last_name)
これは、独自のクラスを定義するのと似ていますが、より簡単ですtype(v) == node
。など。ただし、火山が指摘したように、に格納されている値namedtuple
は変更できないことに注意してください(anamedtuple
は不変です)。
レコード内の値を実際に変更する必要がある場合、最適なオプションはクラスです。
class node(object):
def __init__(self, *arg_list):
for (name, arg) in zip('a b c d'.split(), arg_list):
setattr(self, name, arg)
v = node(1, 20, 300, "Eric")
print v.d # "Eric"
v.d = "Ajay" # Works
私がお勧めしない最後のオプションは、ATOzTOAが述べているように、実際にはリストまたはタプルを使用するnode[3]
ことです。要素はあまり読みにくい方法でアクセスする必要がありますnode.last_name
。また、リストまたはタプルを使用する場合、フィールドの順序を簡単に変更することはできません(一方、名前付きタプルまたはカスタムクラス属性にアクセスする場合、順序は重要ではありません)。
通常、複数node
のオブジェクトがリストに入れられます。これは、このような目的のための標準のPython構造です。
all_nodes = [node(…), node(…),…]
また
all_nodes = []
for … in …:
all_nodes.append(node(…))
また
all_nodes = [node(…) for … in …]
最適な方法は、さまざまなnode
オブジェクトの作成方法によって異なりますが、多くの場合、リストが最適な構造である可能性があります。
ただし、スプレッドシートテーブルに似たものを保存する必要があり、その列にアクセスするための速度と機能が必要な場合は、NumPyのレコード配列またはPandasのようなパッケージを使用した方がよい場合があります。