"Ä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.
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

"Ähnlichstes" Tupel herausfinden

Beitragvon fbuchinger » Dienstag 1. Mai 2007, 21:40

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

Beitragvon BlackJack » Dienstag 1. Mai 2007, 22:31

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

Beitragvon birkenfeld » Mittwoch 2. Mai 2007, 10:09

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

Beitragvon BlackJack » Mittwoch 2. Mai 2007, 11:21

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

Beitragvon birkenfeld » Mittwoch 2. Mai 2007, 11:36

Ja, wer will das denn nicht?

;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder