Python中有元组数据结构吗
我想要一个包含三个项目的组合,分别是标签、名称和一个值的列表(数组),那么有什么好的数据结构可以用来存储这些东西呢?
现在我在用字典,但它只能存储两个项目,不过遍历起来很简单。
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
),正如其他答案提到的那样。它的好处显而易见,就是字段是有名字的,这样使用这些字段的代码会更清晰。