Find the closest relative

MRAB google at mrabarnett.plus.com
Fri May 25 18:46:34 EDT 2007


On May 25, 12:08 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Fri, 25 May 2007 05:09:00 -0300, jm.sur... at no.spam.gmail.com
> <jm.sur... at gmail.com> escribió:
>
>
>
> >     Vehicle
> >     |
> >     |--- Two Wheeler
> >     |       |
> >     |       |--- BatteryPowered
> >     |       |--- PetrolPowered
> >     |       |--- DieselPowered
> >     |
> >     |--- Three Wheeler
> >     |       |
> >     |       |--- AutoRicksaw
> >     |
> >     |--- Four Wheeler
> >     |       |
> >     |       |--- GeneralTrans
> >     |       |       |--- Car
> >     |       |               |--- Car1
> >     |       |               |--- Car2
> >     |       |               |--- Car3
> >     |       |
> >     |       |--- PublicTrans
> >     |       |       |--- Bus
> >     |       |               |--- Bus1
> >     |       |               |--- Bus2
> >     |       |--- Goods
> >     |               |--- Lorry
> >                             |--- Lorry1
> >                             |--- Lorry2
> >                             |--- Lorry3
>
> >  Now given one instance of some type, I want to choose between second
> > and third, whichever
> >  is closest relative to the first object.
> >  Eg.
> >     Instance(Car1), Instance(Lorry1), Instance(AutoRicksaw)  =>
> > Instance(Lorry1)
>
> If your classes actually form a tree (you have only single inheritance)
> then you may use the mro():
>
> Car1.mro() = [Car, GeneralTrans, FourWheeler, Vehicle, object]
> Lorry1.mro() = [Lorry, Goods, FourWheeler, Vehicle, object]
> AutoRicksaw.mro() = [ThreeWeeler, Vehicle, object]
>
> Now you have to find the first item in Lorr1.mro that appears also in
> Car1.mro, and the same for AutoRicksaw.mro; the least index on Car1.mro
> wins (Or the least index in the other list; or the least sum; that depends
> on your exact definition of "closest relative").
> (Under the Argentinian law, you measure how "close" two relatives are,
> starting with one person, going up the tree until you find a common
> ancestor, and going down to the other person. That is, summing up the
> indices on both "mro" lists for the common ancestor).
>
The distance between 2 classes is (roughly) the sum of the distances
to the root class minus twice the distance from their common ancestor
to the root class, or:

def Distance(class1, class2):
	set1, set2 = set(class1.mro()), set(class2.mro())
	return len(set1) + len(set2) - 2 * len(set1 & set2)

Seems to work OK.




More information about the Python-list mailing list