У меня есть список объектов, каждый из которых имеет 3 атрибута, и я хочу найти, есть ли у какого-либо из моих объектов какие-либо перекрывающиеся атрибуты и вытаскивать их как наборы объектов с перекрывающимися атрибутами.Соответствие Python по повторяющимся атрибутам
Позвольте мне уточнить:
class Obj():
'''My example objects! they have 3 attributes.'''
def __init__(a, b, c):
self.a = a
self.b = b
self.c = c
>>>> obj1 = Obj(a= 1, b = 2, c = 3)
>>>> obj2 = Obj(a= 1, b = 5, c = 6)
>>>> obj3 = Obj(a= 10, b = 12, c = 3)
>>>> obj4 = Obj(a= 0, b = 0, c = 0)
>>>> obj5 = Obj(a= 100, b = 5, c = 5)
>>>> obj6 = Obj(a = -10, b = 0, c = 56)
>>>> obj7 = Obj(a = None, b = None, c = None)
# obj2 matches obj1 on attribute: "a"
# obj3 matches obj1 on attribute: "c"
# obj5 matches obj2 on attribute: "b"
# obj6 matches obj4 on attribute: "b"
# obj7 matches no one
Поэтому мой вывод должен быть:
[[obj1, obj2, obj3, obj5], [obj4, obj6], [obj7]]
Есть ли способ, что я могу сделать это с помощью Python? Также будут полезны любые ключевые слова, которые я могу найти для таких вещей. Я попытался найти решение ниже. Кажется ... хаки.
Редактировать: пришлось изменить несколько цифр в соответствии с моим примером. извините за опечатку!
Edit: Мои текущие попытки решения:
adict = defaultdict(list)
for obj in list_objects:
adict[obj.a].append(obj)
adict[obj.b].append(obj)
adict[obj.c].append(obj)
Тогда поиск adict.values () для списков больше, чем 2. Затем объединить списки (как-то).
Я надеюсь на элегантное решение?
Итак, вы хотите, чтобы «совпадения» были транзитивными, если obj2 соответствует obj1, а obj3 соответствует obj2, то obj3 соответствует obj1, даже если они не разделяют никаких атрибутов? – abarnert
Похоже на [Union Find] (http://en.wikipedia.org/wiki/Union_find) –
Как вы хотите справиться с тем, что 'obj4' и' obj5' соответствуют значению 'a'? –