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