Python - Auswahlliste, geringste Anweichung

Don_2020

Lt. Commander
Registriert
Aug. 2019
Beiträge
2.042
Berechnung ergibt a=24.3 (alles in Python 3.9)
Tabelle mit Bauteilen [10, 17], [15, 23], [20, 38}, [25, 42], [30, 53]....
Berechneter Wert a soll mit den 1. Werten der Tabelle verglichen werden oder der nächst gelegene Wert genommen werden.
Der zum Wertepaar gehörende 2. Wert soll in eine Ergebnistabelle geschrieben werden.
Beispiel: a = 24.3; nächstgelegener Wert ist das 4. Wertepaar [25,42]. Hier soll also der Wert 25 gefunden und der Wert 42 in die Ergebnistabelle eingetragen werden.
Soweit die Aufgabenbeschreibung. Wie vergleiche ich die Wertepaare und bestimme die kleinste Abweichung. Die Tabelle der Wertepaare ist erweiterbar. Hier sollte automatisch das Ende erkannt werden.

Das ganze ist für ein privates Programmierprojekt. Leider fehlen mir noch einige Grundlagen. Wer kann mir Helfen?
 
Wie viele Bauteile hast du? Dutzende, hunderte, tausende?
Wenn nur dutzende oder hunderte hast du viele relativ elegante Möglichkeiten, Mit map kannst du den jeweils ersten Wert durch abs(a-wert) ersetzen und dann nach dem ersten Element sortieren - das scheint python sowieso von alleine zu machen wenn du sorted verwendest.

Das ist nicht schrecklich performant, aber lässt sich sehr übersichtlich mit 1-3 Zeilen Code machen.
 
Es sind in der Regel duzende Werte. Ich kann aber jetzt noch nicht sdagen vielviele Zahlenpaare es am Ende werden. Deshalb möchte ich keine festen Zahlen in den Code.
 
Ich würde dringend empfehlen die Grundlagen mit einem Kurs, Buch oder einfach Tutorials aus dem Netz zu lernen. Diese Problem kann mit nur etwas Python Grundwissen lösen, am Ende ist das nur eine for Schleife über die Liste und ein paar Vergleiche.

Der einfachste Ansatz wäre mit einer for Schleife über die Liste zu iterieren, und jeweils die absolute Differenz von a und dem ersten Element aus der Liste zu berechnen. Dann einfach außerhalb der Schleife eine Variable setzten in der du dir die niedrigste beobachtete Differenz (und den Index dieses Elements in der Liste) merkst. Jedes mal wenn du eine niedrigere Differenz siehst, aktualisierst du diese Variable.

Es gibt noch sehr viele andere Varianten das zu lösen, sortieren der Liste kann das ganze auch vereinfachen. Oder eine Liste mit Differenzen berechnen und diese sortieren um die niedrigste zu finden.
 
  • Gefällt mir
Reaktionen: BeBur, mercury und kamanu
Python:
eingabe = 24.3

# Liste von Listen mit den Bauteilen
bauteile = [[10, 17], [15, 23], [20, 38], [25, 42], [30, 53]]

# Ich bin jetzt mal davon ausgegangen, dass der zweite Wert jeweils dem Bauteil entspricht,
# deswegen hab ich auch nur genau den Wert zurückgegeben (42)
# Um den Code hier zu verstehen, schau dir List Comprehensions, Tupel und Array Slicing an.
# Dann sollte er eigentlich verständlich sein.
bauteil = sorted([(abs(eingabe - x ), x, y) for x, y in bauteile])[0][2]

print(bauteil)
 
  • Gefällt mir
Reaktionen: BeBur
Don_2020 schrieb:
Leider fehlen mir noch einige Grundlagen. Wer kann mir Helfen?
solltest du die dann nicht erst erlernen?

Ich meine, du hast jetzt zwar die Loesung in einer Zeile praesentiert bekommen, aber du wirst es nicht verstehen. Python list comprehension ist eines der schoenen Sprachfeatures von Python, aber du haettest das locker mit einer "normalen" Schleife loesen sollen koennen - das sind die elementarsten Grundlagen, wie willst du jetzt mit deinem Programmierprojekt weitermachen?

Wenn du Python jetzt natuerlich nie wieder benutzen wirst, ok, dann ist es egal - copy and paste und gut ist - aber sonst ist dir einfach nicht geholfen.
 
  • Gefällt mir
Reaktionen: BeBur und kamanu
Dalek schrieb:
Ich würde dringend empfehlen die Grundlagen mit einem Kurs, Buch oder einfach Tutorials aus dem Netz zu lernen. Diese Problem kann mit nur etwas Python Grundwissen lösen, am Ende ist das nur eine for Schleife über die Liste und ein paar Vergleiche.

Der einfachste Ansatz wäre mit einer for Schleife über die Liste zu iterieren, und jeweils die absolute Differenz von a und dem ersten Element aus der Liste zu berechnen. Dann einfach außerhalb der Schleife eine Variable setzten in der du dir die niedrigste beobachtete Differenz (und den Index dieses Elements in der Liste) merkst. Jedes mal wenn du eine niedrigere Differenz siehst, aktualisierst du diese Variable.

Es gibt noch sehr viele andere Varianten das zu lösen, sortieren der Liste kann das ganze auch vereinfachen. Oder eine Liste mit Differenzen berechnen und diese sortieren um die niedrigste zu finden.
@Don_2020
Um die Version von @Dalek nochmal aufzugreifen, da sie eher die Grundlagen von Python verwendet wie es @abcddcba vorgeschlagen hat:
Python:
eingabe = 24.3

# Liste von Listen mit den Bauteilen
bauteile = [[10, 17], [15, 23], [20, 38], [25, 42], [30, 53]]


# Für die folgende Schleife merke ich mir die kleinste Abweichung. Zunächst setze ich diese jedoch auf unendlich
kleinsteAbweichung = float("inf")
# Hier steht nachher das Bauteil, was am nächsten dran ist drin
wahrscheinlichstesBauteil = None

# Gehe alle Bauteile in der Liste deiner Bauteile durch
for bauteil in bauteile:
    # Berechne die Abweichung des aktuellen Bauteils zum Eingabewert
    abweichung = abs(bauteil[0] - eingabe)
    # Wenn die Abweichung kleiner ist als die bisher kleinste Abweichung...
    if abweichung < kleinsteAbweichung:
        # ...speichere die Abweichung als neue kleinste Abweichung...
        kleinsteAbweichung = abweichung
        # ...und setze das aktuelle Bauteil als unser wahrscheinlichstes Bauteil
        wahrscheinlichstesBauteil = bauteil
    # Wenn die Abweichung nicht kleiner war, dann wird mit dem nächsten Bauteil weitergemacht

# Am Ende wird wieder die 42 ausgegeben:
print(wahrscheinlichstesBauteil[1])


Ein potentieller Spezialfall wird von meinen beiden Code-Beispielen übriges nicht abgefangen:
Wenn du zwei Bauteile [10, 20] und [20, 10] hast und deine Eingabe 15 ist, wird immer nur das erste der beiden ausgegeben werden, da dieses im ersten Code-Fall schlicht das erste Element der sortierten Liste ist bzw. im zweiten Code halt als erstes gefunden wird.

Noch ein paar nützliche Links: for-Schleifen, if-else-Bedinungen, array-slicing, array-indexing und mehr slicing
 
Zuletzt bearbeitet:
Zurück
Oben