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, 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?
I know I can work around this by changing the set of elements to a dict
that maps key -> element, but this feels unsatisfactory. It's
redundant, as the element already contains all the necessary
information, and the set already knows how to use it, and the set must
remember the original elements anyway, to be able to iterate over them,
so why not allow one to retrieve them? Secondly, the data structure I
need conceptually *is* a set of elements, so it feels wrong to
pigeonhole it into a dict.
This wasn't an isolated case, we stumbled on this several times while
trying to use sets. In comparison, STL sets don't have this limitation.
If this is not possible, I would like to propose either that set's
__getitem__ translates key to value, so that s['foo'] would return the
first element, or, if this is considered ugly, an equivalent method,
such as s.get('foo').
_______________________________________________
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