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!
"Ähnlichstes" Tupel herausfinden
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
- 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:
So spart man sich das "Einpacken" von Distance und Item in ein Tupel und das anschließende Auspacken.
Code: Alles auswählen
from functools import partial
result = min(data, key=partial(distance, given))
- 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?