Is there a tuple data structure in Python
I want to have an 3 item combination like tag, name, and list of values (array) what is the best possible data structure to store such things.
Current I am using dictionary, but it only allows 2 items, but easy traversal using
for k, v in dict.iteritems():
can we have something similar like:
for k, v, x开发者_如何学JAVA in tuple.iteritems():
Python tutorial on data structutres see section 5.3 "Tuples and sequences"
however, if you want to use "name" to index the data, you probably want to use a dictionary that has the string name as key and values are tuple of (tag, [list, of, values]) e.g.
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()
this way alsod["foo"]
will work, just like for any other dictionary.
You can consider the collections.namedtuple
type to create tuple-like objects that have fields accessible by attribute lookup.
collections.namedtuple(typename, field_names[, verbose])
Returns a new tuple subclass named typename. The new subclass is used to create tuple-like objects that have fields accessible by attribute lookup as well as being indexable and iterable. Instances of the subclass also have a helpful docstring (with typename and field_names) and a helpful
__repr__()
method which lists the tuple contents in a name=value format.
>>> 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]
>>>
Building on other answers, an example of filtering a list of mytup
objects:
>>> 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
objects can, of course, be used in other structures (e.g a dict
), as mentioned in other answers. The advantage is, obviously, that the fields are named, and code using them is clearer.
why not just use a list of tuples (yes, this is a data type in python, like lists, but immutable):
mylistoftuples = [(1, 2, 3), (2, "three", 4), (3, 4, [1, 2, 3, 4, 5])]
for k, v, x in mylistoftuples:
print k, v, x
Here's a comment to @gimel's answer:
>>> 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])]
You can have an array of 3-item tuples.
arr = [ (1,2,3), (4,5,6), (7,8,9)]
for (k, v, x) in arr:
# do stuff
精彩评论