[Python-Dev] Getting values stored inside sets (original) (raw)

Terry Reedy tjreedy at udel.edu
Fri Apr 3 14:26:02 CEST 2009


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



More information about the Python-Dev mailing list