タグ、名前、値のリスト(配列)のような3つの項目の組み合わせが欲しいのですが、そのようなものを格納するための最良のデータ構造は何ですか。
現在、辞書を使用していますが、2つのアイテムしか使用できませんが、簡単にトラバースできます。
for k, v in dict.iteritems():
次のようなものがありますか?
for k, v, x in tuple.iteritems():
データ構造に関するPythonチュートリアルは、セクション5.3「タプルとシーケンス」を参照してください。
ただし、「name」を使用してデータのインデックスを作成する場合は、文字列名をキーとして使用し、値が(tag、[list、of、values])のタプルであるディクショナリを使用することをお勧めします。
d =
{ "foo" : ("dog", [1,2,3,4]),
"bar" : ("cat", [4,5,6,7,8,9]),
"moo" : ("cow", [4,5,7,8,9,1,3,4,65])
}
for name,(tag,values) in d.items():
do_something()
この方法もd["foo"]
、他の辞書と同じように機能します。
タプルのリストを使用しないのはなぜですか(はい、これはリストのようなPythonのデータ型ですが、不変です):
mylistoftuples = [(1, 2, 3), (2, "three", 4), (3, 4, [1, 2, 3, 4, 5])]
for k, v, x in mylistoftuples:
print k, v, x
collections.namedtuple
属性ルックアップによってアクセス可能なフィールドを持つタプルのようなオブジェクトを作成するタイプを検討できます。
collections.namedtuple(typename, field_names[, verbose])
typename という名前の新しいタプル サブクラスを返します。新しいサブクラスは、属性ルックアップによってアクセス可能なフィールドを持つタプルのようなオブジェクトを作成するために使用され、インデックス可能で反復可能です。サブクラスのインスタンスには、便利な docstring (typename と field_names を含む) と
__repr__()
、タプルの内容を name=value 形式でリストする便利なメソッドもあります。
>>> import collections
>>> mytup = collections.namedtuple('mytup', ['tag','name', 'values'])
>>> e1 = mytup('tag1','great',[1,'two',3])
>>> e1
mytup(tag='tag1', name='great', values=[1, 'two', 3])
>>> e1.values
[1, 'two', 3]
>>>
他の回答に基づいて、mytup
オブジェクトのリストをフィルタリングする例:
>>> tlist = [mytup("foo", "dog", [1,2,3,4]),
mytup("bar","cat", [4,5,6,7,8,9]), mytup("moo","cow", [4,5,7,8,9,1,3,4,65])]
>>> tlist
[mytup(tag='foo', name='dog', values=[1, 2, 3, 4]),
mytup(tag='bar', name='cat', values=[4, 5, 6, 7, 8, 9]),
mytup(tag='moo', name='cow', values=[4, 5, 7, 8, 9, 1, 3, 4, 65])]
>>> [t for t in tlist if t.tag == 'bar']
[mytup(tag='bar', name='cat', values=[4, 5, 6, 7, 8, 9])]
>>>
Namedtuple
dict
もちろん、他の回答で述べたように、オブジェクトは他の構造(たとえば a )で使用できます。利点は、明らかに、フィールドに名前が付けられ、それらを使用するコードがより明確になることです。
@gimelの回答へのコメントは次のとおりです。
>>> import collections
>>> T = collections.namedtuple("T", 'tag name values')
>>> from itertools import starmap
>>> list(starmap(T, [("a", "b", [1,2]), ("c", "d",[3,4])]))
[T(tag='a', name='b', values=[1, 2]), T(tag='c', name='d', values=[3, 4])]
3項目のタプルの配列を持つことができます。
arr = [ (1,2,3), (4,5,6), (7,8,9)]
for (k, v, x) in arr:
# do stuff