set using alternative hash function?
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Thu Oct 15 11:15:42 EDT 2009
En Thu, 15 Oct 2009 11:42:20 -0300, Austin Bingham
<austin.bingham at gmail.com> escribió:
> On Thu, Oct 15, 2009 at 4:06 PM, Anthony Tolle <anthony.tolle at gmail.com>
> wrote:
>> Why not use a dict? The key would be the object name. Pretty much
>> the same behavior as a set (via the key), and you can still easily
>> iterate over the objects.
>
> To reiterate, dict only gets me part of what I want. Whereas a set
> with uniqueness defined over 'obj.name' would guarantee no name
> collisions, dict only sorta helps me keep things straight; it doesn't
> actually enforce that my values have unique names.
I think you didn't understand correctly Anthony Tolle's suggestion:
py> class Foo:
... def __init__(self, name): self.name = name
...
py> objs = [Foo('Joe'), Foo('Jim'), Foo('Tom'), Foo('Jim')]
py> objs
[<__main__.Foo instance at 0x00BB8238>,
<__main__.Foo instance at 0x00BB83C8>,
<__main__.Foo instance at 0x00BB7B20>,
<__main__.Foo instance at 0x00BB7DC8>]
py> d = dict((o.name, o) for o in objs)
py> d.keys()
['Jim', 'Joe', 'Tom']
py> d.values()
[<__main__.Foo instance at 0x00BB7DC8>,
<__main__.Foo instance at 0x00BB8238>,
<__main__.Foo instance at 0x00BB7B20>]
keys in a dict are unique; values form the set you're looking for. If it's
more complex that just a name, define a function:
def my_funny_key_extractor(item):
return some(operations[on](item))
d = dict((my_funny_key_extractor(o), o) for o in objs)
If you feel so inclined, you could implement the MutableSet ABC based on
this and have a full featured set implementation.
--
Gabriel Genellina
More information about the Python-list
mailing list