What would you call such an object (was: ordered dict)
Hi, I am wondering if in y'alls opinion the following is "just a dictionary" or is it a different kind of object that has some of the characteristics of a dictionary, and has order. If y'all think that it is "just a dictionary", then how does one override the notion of a "hash" for the key in a dictionary and make it some other ordered structure (e.g. a B-Tree, AVL, etc). (Please no flame toss to some other list -- this is a "use" of an ordered "ordered dict") I don't know what such a critter would be called (in Python). It has the name of "array" language where it is central, but don't want to go into that. The object has the following characteristics: - It is indexed by keys which are immutable (like dicts) - Each key has a single value (like dicts) - The keys are ordered (usually a B-Tree underneath) - The keys are "sorted" yielding a hierarchy such that (using Python tuples as an example and pseudo Python): object = { (0,): "value of node", (0,"name") : "name of node", (0,"name",1): "some data about name", (1,): "value of another node", (1,2,3): "some data value", (2,): 2, (2,2,"somekey",1): 32, (3,): 28, ("abc",1,2): 14 } - Introspection of the object allows walking the keys by hierarchy, using the above: key = object.order(None) -> 0 key = object.order(key) -> 1 key = object.order(key) -> 2 key = object.order(key) -> 3 key = object.order(key) -> "abc" key = object.order(key) -> None The first key is fetched when (None) is the initial key (or last key if modifier is -1) Supplying a modifier (-1, where 1 is default of forward, -1 is reverse) in the call traverses the keys in the reverse order from that shown above. - Introspection of the key results in: hasdata = object.data(key) =0 no subkeys no data for 'key' (in the above (39) would have no subkeys, no data) =1 no subkeys has data for 'key' (in the above (3) has no subkeys, but has data) =10 has subkeys no data for 'key' (in the above (2,2) has subkeys but no data) =11 has subkeys has data for 'key' (in the above (2) has subkeys and has data) - Introspection of object can yield "depth first" keys key = object.query(None) -> (0,) key = object.query(key) -> (0,"name") key = object.query(key) -> (0,"name",1) key = object.query(key) -> (1,) key = object.query(key) -> (1,2,3) key = object.query(key) -> (2,) key = object.query(key) -> (2,2,"somekey",1) key = object.query(key) -> (3,) key = object.query(key) -> ("abc",1,2) key = object.query(key) -> None Like object.order(), object.query() has the same "reverse" (using -1) option to walk the keys in a reverse order. - Having an iterator over order/query: for key in object.ordered([start[,end]): for key in object.queryed([start[,end]): (spelling?? other alternative) - Set/get of object[(0,"name")] = "new name of node" print object[(0,"name")] Cheers, --ldl -- LD Landis - N0YRQ - de la tierra del encanto 3960 Schooner Loop, Las Cruces, NM 88012 651/340-4007 N32 21'48.28" W106 46'5.80" "If a thing is worth doing, it is worth doing badly." –GK Chesterton. An interpretation: For things worth doing: Doing them, even if badly, is better than doing nothing perfectly (on them).
"LD 'Gus' Landis" <ldlandis@gmail.com> wrote:
Hi,
I am wondering if in y'alls opinion the following is "just a dictionary" or is it a different kind of object that has some of the characteristics of a dictionary, and has order.
If y'all think that it is "just a dictionary", then how does one override the notion of a "hash" for the key in a dictionary and make it some other ordered structure (e.g. a B-Tree, AVL, etc). (Please no flame toss to some other list -- this is a "use" of an ordered "ordered dict")
This is easily implemented as a variant of a treap, in which rather than choosing a new sub-node based on different characters in a string, you choose a new sub-node based on different values in a tuple. There is one small problem with the structure as you have described it; in order to be able to choose a (sorted) ordering on the portion of a key as you show here...
key = object.order(key) -> 3 key = object.order(key) -> "abc"
...it won't make any sense in future Pythons. 3 < "abc" will return an exception. - Josiah
participants (2)
-
Josiah Carlson
-
LD 'Gus' Landis