Guten Abend
folgendes Problem,
ich habe ein Array welches meine X-Werte enthält also z.B.
[0,0.25,0.5,0.75,1.0,1.25 ...]
Dann habe ich einen Wert z.B. 0.6. Jetzt möchte ich die Stelle von dem X Array wissen die am nächsten dran ist. Also hier wäre es die 3. mit dem Index 2
Leider fällt mir kein Lösungsschema dafür ein, welches mit allen Werten funktionieren würde
Kann mir jemand einen Ansatz geben ?
Gruß
Algorythmus zum Stellensuchen
Code: Alles auswählen
>>> werte = [0, 0.25, 0.5, 0.75, 1.0]
>>> werte.index(min(werte, key=lambda x: abs(x - 0.6)))
2
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Also bei dem Titel solltest du nochmal nacharbeiten ...
Mal als Denkanstoss (nimmt die Zahl, die am nahesten ist, ist aber steuerbar durch das lambda):
Mal als Denkanstoss (nimmt die Zahl, die am nahesten ist, ist aber steuerbar durch das lambda):
Code: Alles auswählen
In [20]: import operator
In [21]: import itertools
In [22]: cur_pos = 0.6
In [23]: a = [0,0.25,0.5,0.75,1.0,1.25]
In [24]: b = map(lambda x: abs(cur_pos - x), a)
In [25]: c = zip(b, itertools.count(0))
In [26]: min(c, key=operator.itemgetter(0))
Out[26]: (0.099999999999999978, 2)
In [27]: a[_[1]]
Out[27]: 0.5
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Alos ich würde ganz ohne die Liste arbeiten. Einfach den Wert - hier 0.6 - nehmen und durch den x-Abstand - hier 0.25 - dividieren. Ist die erste Dezimalstelle größer gleich 5, aufrunden -> gesuchte Stelle; ist Ergebnis kleiner gleich 5, abrunden
0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3
0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3
Kannst du mir erlären, was du hier genau machst?mushroom hat geschrieben:Alos ich würde ganz ohne die Liste arbeiten. Einfach den Wert - hier 0.6 - nehmen und durch den x-Abstand - hier 0.25 - dividieren. Ist die erste Dezimalstelle größer gleich 5, aufrunden -> gesuchte Stelle; ist Ergebnis kleiner gleich 5, abrunden
0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3
Steht ja eigentlich schon da.syntor hat geschrieben:Kannst du mir erlären, was du hier genau machst?
Die x-Werte in der Liste haben einen konstanten Abstand, hier 0.25.
Den Wert, hier 0.6, dividiere ich gerade durch diesen Abstand, ergibt 0.6/0.25 = 2.4.
Ist die erste Dezimalstelle kleiner 5, liefert Abrunden des vorigen Ergebnisses den gesuchten Index, also 4<5 -> 2.4 = 2.
Ist die erste Dezimalstelle größer/gleich 5, liefert Aufrunden den gesuchten Index. Beispiel:
0.63/0.25 = 2.52 -> 3
Hat der Wert den gleichen Abstand zu zwei benachbarten x-Werten, muß man sich natürlich entscheiden, on Auf- oder Abrunden:
0.625/0,25 = 2.5 -> 3 (nach obiger Beschreibung)
Nachtrag: Sehe gerade, daß meinem vorherigen Beitrag statt
0.3/0.25 -> 3
dies
0.63/0.25 -> 3
hätte stehen müssen.
Nachtrag 2: Dein bereits in Python umgesetzter Ansatz sieht aber auch ganz gut aus. Hatte den erst jetzt gesehen, nachdem ich meinen ersten Beitrag gepostet habe. Das kommt davon, wenn man zuviel Tabs gleichzeitig öffnet
Würde jetzt aber mit meinen laienhaften Kenntnissen sagen, daß man bei deiner Umsetzung die Art der Rundung (kaufmännisch, mathematisch) nicht beeinflussen kann. Lasse mich aber gerne eines Besseren belehren.
Also runden willst du
Code: Alles auswählen
>>> round(0.6/0.25)
2.0
>>> round(0.63/0.25)
3.0
Was natürlich eine Ordnung der Werte voraussetzt ...EyDu hat geschrieben:Das bisect-Modul könnte hier auch hilfreich sein.
Solange nicht klar ist, ob es ein Ordnung gibt oder sogar äquidistante Werte sichergestellt sind, bringen weitere Überlegungen wohl wenig. Offenbar hat der OP aber wenig Interesse an den Antworten ...
Ich gehe davon aus, dass jemand die Dokumentation zu einem Modul liest, bevor er es verwendet. Dann soll der OP selber entscheiden, ob es passt oder nicht.numerix hat geschrieben:Was natürlich eine Ordnung der Werte voraussetzt ...EyDu hat geschrieben:Das bisect-Modul könnte hier auch hilfreich sein.
Solange nicht klar ist, ob es ein Ordnung gibt oder sogar äquidistante Werte sichergestellt sind, bringen weitere Überlegungen wohl wenig. Offenbar hat der OP aber wenig Interesse an den Antworten ...
Das Leben ist wie ein Tennisball.
Wenn nun auch die Abstände - wie in dem Beispiel - immer gleich sind, kannst du den gesuchten Wert über eine direkte Berechnung ermitteln - das wäre dann am effizientesten.
Falls die Abstände nicht gleich sind, ist der Hinweis von EyDu der entscheidende.
Falls die Abstände nicht gleich sind, ist der Hinweis von EyDu der entscheidende.