Seite 1 von 1

"Ähnlichstes" Tupel herausfinden

Verfasst: Dienstag 1. Mai 2007, 21:40
von fbuchinger
Hallo,

mein Programm generiert Ergebnistupel mit acht Werten und hat einige hundert dieser Tupel in einer gepickelten Liste gespeichert. Ich möchte aus der Menge dieser Tupel nun jenes herausfinden, das dem eben generierten Tupel am ähnlichsten ist (d.h. die geringste Abweichung hat).

Beispiel:
Ergebnis:
(8,1,3,5,6,2,1,0)
Gespeichert:
1. (0,20,1,50,2,70)
2. (1,2,3,4,5,6,7,8)

Es erscheint logisch, dass das zweite Tupel dem Ergebnis "näher" liegt als das erste. Meine Frage: wie kann ich solche Berechnungen am elegantesten in Python lösen? Was ändert sich, wenn ich später von der gepickelten Liste auf eine SQLite-Datenbank umsteige (jeder Wert kommt in ein eigenes Feld)?

Danke für euer Feedback!

Verfasst: Dienstag 1. Mai 2007, 22:31
von BlackJack
Entscheidend ist natürlich wie Du die "Entfernung" zwischen zwei Tupeln definierst. Grundsätzlich könnte es so laufen:

Code: Alles auswählen

import math


def distance(a, b):
    return math.sqrt(sum((x - y)**2 for x, y in zip(a, b)))


def main():
    given = (8, 1, 3, 5, 6, 2, 1, 0)
    data = ((0, 20, 1, 50, 2, 70), (1, 2, 3, 4, 5, 6, 7, 8))
    result = min((distance(given, item), item) for item in data)[1]
    print result

Verfasst: Mittwoch 2. Mai 2007, 10:09
von birkenfeld
Man könnte hier sehr schön das `key`-Argument zu `min` und `partial` verwenden:

Code: Alles auswählen

from functools import partial
result = min(data, key=partial(distance, given))
So spart man sich das "Einpacken" von Distance und Item in ein Tupel und das anschließende Auspacken.

Verfasst: Mittwoch 2. Mai 2007, 11:21
von BlackJack
Könnte man beides machen wenn man Python 2.5 einsetzen würde. :-)

Verfasst: Mittwoch 2. Mai 2007, 11:36
von birkenfeld
Ja, wer will das denn nicht?

;)