Python custom set intersection
python, python-2.x, set-intersection
Solution
I hate answering my own questions, so I'll hold off on marking this as the 'answer' for a little while yet.
Turns out the way to do this is as follows:
import types
p = Person("Bar", -1)
new_hash_method = lambda obj: hash(obj.name)
p.__hash__ = types.MethodType(new_hash_method, p)
for i in xrange(0, len(union_list)):
union_list[i].__hash__ = types.MethodType(new_hash_method, union_list[i])
set(union_list).intersection(p)
It's certainly dirty and it relies on `types.MethodType`, but it's less intensive than the best solution proposed so far (glglgl's solution) as my actual `union_list` can contain potentially in the order of thousands of items, so this will save me re-creating objects every time I run this intersection procedure.
Problem
So, there exists an easy way to calculate the intersection of two sets via set.intersection(). However, I have the following problem: ``` class Person(Object): def __init__(self, name, age): self.name = name self.age = age l1 = [Person("Foo", 21), Person("Bar", 22)] l2 = [Person("Foo", 21), Person("Bar", 24)] union_list = list(set(l1).union(l2)) # [Person("Foo", 21), Person("Bar", 22), Person("Bar", 24)] ``` (`Object` is a base-class provided by my ORM that implements basic `__hash__` and `__eq__` functionality, which essentially adds every member of the class to the hash. In other words, the `__hash__` returned will be a hash of every element of the class) At this stage, I would like to run a set intersection operation by `.name` only, to find, say, `Person('Bar', -1).intersection(union_list) #= [Person("Bar", -1), Person("Bar", 22), Person("Bar", 24)]`. (the typical `.intersection()` at this point would not give me anything, I can't override `__hash__` or `__eq__` on the `Person` class, as this would override the original set union (I think) What's the best way to do this in Python 2.x? EDIT: Note that the solution doesn't have to rely on a `set`. However, I need to find unions and then intersections, so it feels like this is amenable to a set (but I'm willing to accept solutions that use whatever magic you deem worthy, so long as it solves my problem!)