Seite 1 von 1
listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 11:19
von haeuslermartin
hallo python Experten,
wiedereinmal plage ich mich mit einem Listenproblem schon seit Tagen herum: ("learning by doing")
Code: Alles auswählen
c=[1,3,2,5,6,6,7,]
#der jeweils nächste Wert mit dem vorhergehenden verglichen, also 3 ist grösser wie 1, 2 ist kleiner wie 3, usw.
#der erste Wert hat ja keinen Vorgänger, darum "for i in c[1:]:", das müsste richtig sein, aber ansonsten blockieren meine grauen Zellen wieder einmal ...
for i in c[1:]:
if i+1 >i:
print("grösser")
elif i+1 ==i:
print("gleich")
else:
print("kleiner")
soll ausgeben:
grösser #als 1
kleiner #als 3
grösser #als 2
grösser #als 5
gleich #wie 6
grösser #als 6
ich weiß, dass ich die Werte falsch anspreche "i+1" ist Quatsch, habe auch schon jede Menge anderer Ausdrücke probiert, z.B. "if [:i+1] >i:" schrecklich, ich weiß,
aber ich komm nicht drauf, wie es richtig geht..
danke im voraus!
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 11:27
von EyDu
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 13:11
von darktrym
Wenn man Werte miteinander vergleicht wo dessen Umgebung eine Rolle spielt, wieso iteriert man nicht über die Index statt über die Werte. Der Code schaut irgendwie nach "random learning" aus.
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 13:55
von Kebap
darktrym hat geschrieben:wieso iteriert man nicht über die Index
Weil es
durchaus eleganter geht 
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 18:17
von Hyperion
haeuslermartin hat geschrieben:... also 3 ist grösser wie 1, 2 ist kleiner wie 3, usw.
ALS es heißt ALS...
Sorry, aber das hat mich immer schon bei meiner Ex-Freundin gestört
(PS: Kommst Du aus den östlichen Bundesländern? Habe die Erfahrung gemacht, dass das da besonders oft vorkommt... genau wie X-Raumwohnung, Konsum, Kaufhalle, usw

)
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 19:26
von pillmuncher
@Hyperion: hier in Bayern heißt es auch "kleiner wie", oder besser gesagt "gloana wia". Ach, die schönen bairischen Diphtonge... Meine Ex war Linguistin, jetzt ist sie Programmiererin, oder besser gesagt, "etza duats brogrammian".
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 20:35
von Hyperion
@pillmuncher: Ja pfundig!
Meine Ex war BWLerin und musste an der Uni "öch ma prögramieren, ne wa"...
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 20:52
von /me
Hyperion hat geschrieben:Meine Ex war BWLerin und musste an der Uni "öch ma prögramieren, ne wa"...
Ihr habt es alle gut. Meine Frau macht IT-Projektmanagement und hat ein Faible für Qualitätssicherung.
Re: listenelemente der Reihe nach vergleichen
Verfasst: Freitag 20. Februar 2015, 21:06
von Hyperion
Oha... meine ist Krankenschwester und meckert nur über die Software, die sie benutzen müssen
Ich sage dann immer, dass ich das besser hinbekommen würde und sie stimmt mir zu. Gott hab ich 's gut

Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 10:30
von haeuslermartin
meine Muttersprache ist bayrisch ... ich sitze hier alleine mit meinen 63 Jahren und dem Buch "python 4 kids", -und eine Mentalität, die sich über "als" oder "wie" aufregt
ist mir völlig fremd. Eure Antworten haben mir diesmal nicht sehr geholfen, sorry, manches ist mir einfach zu hoch, da bin ich nicht fortgeschritten genug,
ich will ja nur wissen, ob der W er t in einer Liste jeweils grösser, kleiner oder gleich dem vorhergehenden ist, wobei ich aber nicht weiß, ob es sich um 396 oder 287 Elemente handelt, -die 6 oder 7 waren ja nur exemplarisch ...
trotzdem danke
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 11:06
von BlackJack
@haeuslermartin: EyDu hat doch eine fast komplette Lösung gepostet. Da fehlt doch nur noch das Vergleichen der beiden Elemente in der Schleife.
@all: Das heisst weder „grösser wie 1” noch „grösser als 1” sondern selbstverständlich „grösser als wie 1”.

Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 11:11
von pillmuncher
@haeuslermartin: EyDu hat dir den entscheidenden Tipp schon gegeben. Aber ich kann es gerne nochmal ausführlicher hinschreiben:
Code: Alles auswählen
for i, j in zip(c, c[:1]):
if i < j:
...
elif i > j:
...
else:
...
Sollte die Liste sehr groß sein, kann man das
Rezept aus der itertools-Doku verwenden:
Code: Alles auswählen
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
for i, j in pairwise(c):
...
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 11:12
von Hyperion
haeuslermartin hat geschrieben:meine Muttersprache ist bayrisch ... ich sitze hier alleine mit meinen 63 Jahren und dem Buch "python 4 kids", -und eine Mentalität, die sich über "als" oder "wie" aufregt ist mir völlig fremd.
Meine Güte, Du wirst doch wohl eine kleine Neckerei verkraften, oder? Hier und da mal Frotzeleien gehört hier einfach dazu - wir sind hier nicht spaßbefreit, was imho eine gute Sache ist
Hast Du denn EyDus Hinweis einmal ausprobiert?
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 12:02
von haeuslermartin
ok, Schwamm drüber, zip kommt in meinem Lehrbuch nicht vor, nach dem, was ich bis jetzt gegoogelt habe bildet der Ausdruck
zip(c, c[:1]) aus meiner liste die entsprechenden Wertepaare
c=[1,3,2,4,5,7,6] sind also [(1,3)(3,2)(2,4)(4,5)(5,7)(7,6)]
ist das bisher richtig?
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 12:32
von Sirius3
@haeuslermartin: bis auf die fehlenden Kommas ist das wohl richtig. Aber anstatt zu googeln, kannst Du einfach in die Python-Dokumentation schauen, oder es direkt im Interaktiven Modus ausprobieren.
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 12:39
von EyDu
Und es sollte natürlich
sein und nicht
Sonst ist das Ergebnis etwas langweilig

Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 12:46
von Hyperion
Sirius3 hat geschrieben:...oder es direkt im Interaktiven Modus ausprobieren.
+1
@haeuslermartin: Hast Du schon einmal eine Python-Shell aufgemacht? Genau für solche Dinge zum Ausprobieren ist die super geeignet! Das schreibt man nicht in seinen Editor, speichert es und ruft dann das Script auf. Nein, einfach in eine Python Shell pasten oder eintippen und ausprobieren
Im offiziellen Tutorial wird das Öffnen und Arbeiten darin iirc gleich zu Beginn beschrieben. Sollte das in Deinem Lehrbuch nicht der Fall sein, so wäre das schlecht und würde mich an der Qualität des Buches zweifeln lassen
Viele installieren Regulars hier nutzen übirgens
IPython, welche noch mehr nette Möglichkeiten bietet als die Standard Python Shell.
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 13:19
von haeuslermartin
dann hab ich das am Anfang ja sogar richtig gemacht mit c[1:] statt c[:1] !!
falsch ist übrigens auch : if i > j:
ich will ja wissen ob der zweite Wert grösser, kleiner, gleich ist,als der vorige ..
also: if j > i :
jetzt krieg ich die richtigen Ergebnisse!!
Trotzdem der Hinweis war entscheidend, vielen Dank!
ps: natürlich probier ich auch in der shell, aber da muss ich jede Variante wieder von vorne machen, und mit der Zeit habe ich da jede Menge Unsinn drauf, da finde ich ein kleines programmchen im neuen Fenster der IDLE praktischer, -ändern, -speichern, -laufen lassen, und wenns klappt, hab ichs auch gleich im Ordner.
Re: listenelemente der Reihe nach vergleichen
Verfasst: Samstag 21. Februar 2015, 17:27
von nezzcarth
haeuslermartin hat geschrieben:
Code: Alles auswählen
c=[1,3,2,5,6,6,7,]
#der jeweils nächste Wert mit dem vorhergehenden verglichen, also 3 ist grösser wie 1, 2 ist kleiner wie 3, usw.
#der erste Wert hat ja keinen Vorgänger, darum "for i in c[1:]:", das müsste richtig sein, aber ansonsten blockieren meine grauen Zellen wieder einmal ...
for i in c[1:]:
if i+1 >i:
print("grösser")
elif i+1 ==i:
print("gleich")
else:
print("kleiner")
[/code]
@haeuslermartin:
Ich weiß nicht, ob das noch relevant ist, da du ja schon die beste Lösung genannt bekommen hast, aber vielleicht ist interessant, wo der Fehler in deinem Vorschlag war:
die Variable 'i' enthält immer das aktuelle Listenelement. i+1 >i muss für positive Zahlen immer wahr sein, weil du nicht auf das nächste Listenelement zugreifst, sondern mit der konkreten Zahl rechnest; für den ersten Durchlauf steht da 3+1 > 3. Irgendwie musst du an die anderen Listenelemente kommen, was in dem aktuellen Code nicht möglich ist. Eine einfache Variante deines Vorschlags ist folgende:
Code: Alles auswählen
c = [1,3,2,5,6,6,7,]
j = c[0]
for i in c[1:]:
if i > j:
print("grösser")
elif j == i:
print("gleich")
else:
print("kleiner")
j = i
Man merkt sich den jeweils letzten Wert und vergleicht damit.
Weiterhin ist es möglich mit Indizes zu arbeiten, statt mit den konkreten Werten; das ist ein die "traditionelle" Variante, die man vielleicht in Pascal oder so verwendet hätte:
Code: Alles auswählen
c = [1,3,2,5,6,6,7,]
for i in range(len(c)-1):
if c[i+1] > c[i]:
print("grösser")
elif c[i+1] == c[i]:
print("gleich")
else:
print("kleiner")
Allerdings sollte man keine von beiden Versionen in Python verwenden, weil das sehr umständlich ist. Trotzdem denke ich, dass es vielleicht interessant sein kann zu wissen, wo der Fehler lag, welche Alternativlösungen es gibt, und weshalb man die in Python nicht verwendet.
Re: listenelemente der Reihe nach vergleichen
Verfasst: Sonntag 22. Februar 2015, 15:31
von haeuslermartin
ja, vielen Dank,
ich hab mir das schon gedacht, warum meine Lösung falsch ist, (ich hab ja mehrere probiert), aber auf die richtige kam ich einfach nicht.
In den Anfängerlehrbüchern ist immer sehr schön das Grundsätzliche beschrieben, aber bei konkreten Problemen reicht das halt oft nicht aus ...
und wenn man neugierig ist, prellt man im Stoff schon gerne etwas vor ..
danke nochmal!