Wert mit Liste vergleichen

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
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

Hi,

nachdem mir das letzte mal hier schnell und nett geholfen wurde (und das googlen hierbei wieder nichts gebracht hat), frage ich einfach noch mal :)
(Entschuldigung für den schlechten Threadtitel, aber mir fällt es schwer, da einen besseren zu finden)

Ich habe einen double Wert, nennen wir ihn a und setzen wir ihn auf a = 0.34. Jetzt habe ich eine Liste b mit Werten, z.B. b = [0.1, 0.2, 0.3, 0.4, 0.5]

Jetzt sieht man ja, dass a zwischen dem 2. und 3. Listenwert liegt (also zwischen b[1] und b[2])... ich habe noch eine zweite Liste und aus der sollen mir jetzt Werte ausgegeben werden!
Und zwar soll jetzt kommen:

Code: Alles auswählen

print ( a* ( c[ b[1] ] + c [ b[2] ] ) )
(die Leerzeichen sind nur der Übersichtlichkeit wegen)

Ich benötige quasi: gegeben Wert a, Liste b, Liste c

Code: Alles auswählen

a_kleiner = Wertkleiner(b, a)
a_größer = Wertgrößer(b, a)
print a*(c[a_kleiner]+c[a_größer])
Dankeschön :)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Was?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
lunar

@jbs hukd321 möchte für ein gegebenes "a" in einer Liste "b" die zwei Werte "b1 = a + e1" und "b2 = a - e2" mit e1, e2 > 0 finden, so dass e1 und e2 minimal sind. Besser? ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mein Ansatz sähe so aus (Python 3.2)

Code: Alles auswählen

In [16]: value = .34

In [17]: list((i, i+1) for i, border in enumerate(zip_longest(b, b[1:])) if border[0] < value < border[1])
Out[17]: [(2, 3)]
Das in eine Funktion verpacken und sich noch um die Randfälle kümmern... `TypeError` am Schluss und leere Liste bei einem Wert kleiner als der erste Listeneintrag.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@hukd321: Falls die Werte in `b` sortiert sind, wäre das `bisect`-Modul aus der Standardbibliothek nützlich.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

lunar hat geschrieben:@jbs hukd321 möchte für ein gegebenes "a" in einer Liste "b" die zwei Werte "b1 = a + e1" und "b2 = a - e2" mit e1, e2 > 0 finden, so dass e1 und e2 minimal sind. Besser? ;)
Danke :)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

BlackJack hat geschrieben:@hukd321: Falls die Werte in `b` sortiert sind, wäre das `bisect`-Modul aus der Standardbibliothek nützlich.

und das funktioniert einwandfrei :)
mit

Code: Alles auswählen

bisect.bisect_left(b, a, lo = 0, hi = len(b))
funktioniert es wie gewünscht
ich hab dann für den rechten wert einfach den obigen +1 gerechnet :)


Danke :)
BlackJack

@hukd321: `lo` und `hi` brauchst Du nicht zu übergeben wenn Du sowieso nur die Default-Werte dafür angibst.
Antworten