[Tutor] named list

spir denis.spir at free.fr
Thu Feb 5 11:09:53 CET 2009


Hello, python world!

I'm looking for a way to implement a kind of "named" list, or named tree, with the following requirements:

* Each item is named (or key-ed), like in a dict.
* Each item (node) can be either a terminal item (leaf) or a sub-list (branch).
* There may be items with the same name, unlike in a dict.
* The item entering order is preserved, unlike in a dict.

* A non-requirement: may be useful that items can be retrieved by name (in case several items have the same name, it's allright to return first one -- it's up to the client code to manage that)

A structural representation of such an object looks like that:

obj
	n1:val
	n2:val
	n3
		n31:val
		n32
			n321:val
			n322:val
		n33
	n4

Which is exactly the same as for a list, except that each item gets a name in addition to its value.
I ask for advices before doing bull**** as I suspect there may be a data structure in language theory that matches that needs. Some questions:

* Do you know of such a structure?
* What is the difference between a tree and a python list? a tree and an array that allows nesting?
* Are items in a tree, as defined in theory, supposed to be of homogeneous type?

I cannot implement that simply by giving items an additional attribute, for items can be of an type and can even change. They also need a whole bunch of custom methods. This would require sub-typing averu possible type, including custom ones (this was the cause of a previous, in which I asked if it was possible to sub-type at a type known at runtime). So I plan instead to implement the whole load of necessary behaviour in a container, thus letting the items unchanged.
A possible design (?) would be to subtype list in order to add such a container object a parallel list of names. So that direct access still directly reaches values, while matching names are accessed by indexing a parallel list:

	obj[n] <-- item
	obj.names[n] <-- name

And maybe:

	obj.link[n] <-- (name,item)
	obj[name] <-- item
	obj.name(item) <-- name

Denis

------
la vida e estranya


More information about the Tutor mailing list