tags:

views:

319

answers:

6

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 in tuple.iteritems():
+4  A: 

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
Daren Thomas
Just for completeness, let's note that this fails badly in the item-lookup department.
Chris Lutz
I agree. See Kimvais below for a solution to that.
Daren Thomas
A: 

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
Roy Tang
+7  A: 

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.

Kimvais
This is a better answer than the selected one - it directly shows a solution to the posed question.
Paul McGuire
+3  A: 

Maybe you should take a look here: Python data structures

Konamiman
+1 Python tutorial rulez. It's one of the best introductions to programming languages I've seen, if not the best. Asking any questions about Python before reading it is ... I don't know...
Tomek Szpakowicz
+3  A: 

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.

gimel
And how do you create an array of these namedtuple to traversed easily. I am sorry, just started Python yesterday only for writing a Python script.
Priyank Bolia
List filtering example added.
gimel
`tlist = map(mytup, [("foo", "dog", [1,2]), ("bar", "cat", [3,4]),])`
J.F. Sebastian
@J.F. Sebastian this is wrong not working: TypeError: __new__() takes exactly 4 arguments (2 given)
Priyank Bolia
@Priyank Bolia: Correct. Replace `map` by `itertools.starmap`. See http://stackoverflow.com/questions/1831218/is-there-a-tuple-data-structure-in-python/1842063#1842063
J.F. Sebastian
+1  A: 

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])]
J.F. Sebastian
working good and short to write, but somehow I prefer the gimel method, which looks more clean to read, though much more typing.
Priyank Bolia