5

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():
3
  • 5
    Question title is misleading; the answer to the question in the title is simply "yes". The body of the question actually asks for the best structure to store some data, which is a different question. Commented Dec 2, 2009 at 9:58
  • -1: "best possible" is meaningless. Please ask a question that can be answered. Best for what purpose? Speed? Storage? Code Complexity? What? Commented Dec 2, 2009 at 11:31
  • sometimes best possible is generic, which means ease of use, the standard way, complexity, unless their is a notable performance issue or speed issue. Commented Dec 3, 2009 at 11:02

5 Answers 5

8

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.

Sign up to request clarification or add additional context in comments.

1 Comment

This is a better answer than the selected one - it directly shows a solution to the posed question.
4

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.

5 Comments

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.
List filtering example added.
tlist = map(mytup, [("foo", "dog", [1,2]), ("bar", "cat", [3,4]),])
@J.F. Sebastian this is wrong not working: TypeError: __new__() takes exactly 4 arguments (2 given)
@Priyank Bolia: Correct. Replace map by itertools.starmap. See stackoverflow.com/questions/1831218/…
4

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

2 Comments

Just for completeness, let's note that this fails badly in the item-lookup department.
I agree. See Kimvais below for a solution to that.
2

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])]

1 Comment

working good and short to write, but somehow I prefer the gimel method, which looks more clean to read, though much more typing.
0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.