Python中有元组数据结构吗

5 投票
5 回答
2722 浏览
提问于 2025-04-15 16:36

我想要一个包含三个项目的组合,分别是标签、名称和一个值的列表(数组),那么有什么好的数据结构可以用来存储这些东西呢?

现在我在用字典,但它只能存储两个项目,不过遍历起来很简单。

for k, v in dict.iteritems():

我们能不能有类似这样的东西:

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

5 个回答

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
8

Python 数据结构教程,请查看第5.3节“元组和序列”

不过,如果你想用“名字”来查找数据,那么你可能需要用字典。字典的特点是用字符串作为键,而对应的值是一个元组,元组里包含一个标签和一个值的列表,比如:

  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"] 也能正常工作,就像其他字典一样。

4

你可以考虑使用 collections.namedtuple 这个类型来创建类似元组的对象,这些对象的字段可以通过属性访问。

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

这个方法会返回一个新的元组子类,名字叫做 typename。这个新的子类可以用来创建类似元组的对象,这些对象不仅可以通过属性访问字段,还可以通过索引访问和遍历。这个子类的实例还会有一个很有用的文档字符串(包含 typename 和 field_names),以及一个很实用的 __repr__() 方法,可以以名字=值的格式列出元组的内容。

>>> 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),正如其他答案提到的那样。它的好处显而易见,就是字段是有名字的,这样使用这些字段的代码会更清晰。

撰写回答