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!)
[Person("Bar", 24)]
, it would givel2
. And I don't understand why you expect to get[Person("Bar", 22), Person("Bar", 24)]
from your operation. – Murther__hash__
and__eq__
functions are already overridden (and I require the behaviour they already have)) – FoundlingPerson("Foo", 21)
be part of the result? I don't understand what your "intersect by name" operation means. – MurtherPerson('Bar', -1)
is not part of the result.. – Murther