"Ähnlichstes" Tupel herausfinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

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!
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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Könnte man beides machen wenn man Python 2.5 einsetzen würde. :-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Ja, wer will das denn nicht?

;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten