5

我想要一个 3 项组合,如标签、名称和值列表(数组),什么是存储这些东西的最佳数据结构。

目前我正在使用字典,但它只允许 2 个项目,但使用很容易遍历

for k, v in dict.iteritems():

我们可以有类似的东西吗:

for k, v, x in tuple.iteritems():
4

5 回答 5

8

关于数据结构的 Python 教程请参阅第 5.3 节“元组和序列”

但是,如果您想使用“名称”来索引数据,您可能希望使用以字符串名称作为键且值是 (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"]可以工作,就像任何其他字典一样。

于 2009-12-02T07:38:45.977 回答
4

为什么不只使用元组列表(是的,这是 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
于 2009-12-02T07:37:43.310 回答
4

您可以考虑collections.namedtuple创建具有可通过属性查找访问的字段的类元组对象的类型。

collections.namedtuple(typename, field_names[, verbose])

返回一个名为 typename 的新元组子类。新的子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段,并且是可索引和可​​迭代的。子类的实例也有一个有用的文档字符串(带有 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对象当然可以用于其他结构(例如 a dict),如其他答案中所述。显然,优点是字段被命名,并且使用它们的代码更清晰。

于 2009-12-02T08:03:51.573 回答
2

这是对@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])]
于 2009-12-03T18:52:01.883 回答
0

您可以拥有一个包含 3 项元组的数组。

arr = [ (1,2,3), (4,5,6), (7,8,9)]
for (k, v, x) in arr:
  # do stuff
于 2009-12-02T07:37:51.930 回答