How do I get a reference to a KEY value of a dictionary?

Andy C ayc8NOSPAM at cornell.edu
Mon Aug 4 23:31:27 EDT 2003


> >is fine for me.  But if I'm not mistaken, your solution still stores the
> >node names in the values of the dictionary (via the Node objects).  So in
> No, just references, not duplicate strings.

OK, you're right -- I assumed that the key and value were duplicated, but
that's not the case.  I don't know why I thought that, maybe since the key
must be immutable and the value is mutable.  So I guess having a dictionary
of the form { 'A': 'A', 'B': 'B' } is not as stupid as it first seems, since
only a reference is stored.  But still I wonder why the language doesn't
have a facility for getting a reference to the key value in constant time.
Apparently someone did it by modifying the C source for the dictionary to
add a ref_key() accessor.  It seems like it would be useful quite often.

> One caveat though, if your graph has cycles, changing the adjacency lists
to direct node
> references instead of names will create reference cycles that may have to
be broken for
> the gc. I have to look into that. You can comment that fixup loop out if
you want to
> keep adjacency lists as name string references instead of node references.

Good point... I thought though that the new python (2.3?) will GC data with
cycles.

> BTW, have you looked at the sets module of 2.3? That would let you have a
set of strings
> with no associated values, and no duplicates (but how do you represent
adjacency lists then?)

Actually, I did run across the sets type recently.  It is actually built *on
top of* dict, so it's no better.  Ex:

>>> a = Set([1,2,3])
>>> a
Set([1, 2, 3])
>>> a._data
{1: True, 2: True, 3: True}

It just stores a dummy value as the value of the dict.

BTW I am using a regular dictionary for the adjacency list, with the list of
destination edges.  I was using another dictionary for the 'cache' of names.

Thanks for the help.

Andy






More information about the Python-list mailing list