Hrvoje Niksic wrote:
I've stumbled upon an oddity using sets. It's trivial to test if a value is in the set, but it appears to be impossible to retrieve a stored value,

Set elements, by definition, do not have keys or position by which to grab. When they do, use a dict or list.

other than by iterating over the whole set. Let me describe a concrete use case.

Imagine a set of objects identified by some piece of information, such as a "key" slot (guaranteed to be constant for any particular element). The object could look like this:

class Element(object):
    def __init__(self, key):
        self.key = key
    def __eq__(self, other):
        return self.key == other
    def __hash__(self):
        return hash(self.key)
    # ...

Now imagine a set "s" of such objects.  I can add them to the set:

 >>> s = set()
 >>> s.add(Element('foo'))
 >>> s.add(Element('bar'))

I can test membership using the keys:

 >>> 'foo' in s
True
 >>> 'blah' in s
False

But I can't seem to find a way to retrieve the element corresponding to 'foo', at least not without iterating over the entire set. Is this an oversight or an intentional feature? Or am I just missing an obvious way to do this?

Use a dict, like you did.

I know I can work around this by changing the set of elements to a dict that maps key -> element, but this feels unsatisfactory.

Sorry, that is the right way.

>  It's
redundant, as the element already contains all the necessary information,

Records in a database have all the information of the record, but we still put out fields for indexes.

tjr

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to