listenelemente der Reihe nach 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
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

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!
Zuletzt geändert von Anonymous am Freitag 20. Februar 2015, 11:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ein kleiner Denkanstoß:

Code: Alles auswählen

for i, j in zip(c, c[:1]):
    print i, j
Das Leben ist wie ein Tennisball.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

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.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

darktrym hat geschrieben:wieso iteriert man nicht über die Index
Weil es durchaus eleganter geht :wink:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

haeuslermartin hat geschrieben:... also 3 ist grösser wie 1, 2 ist kleiner wie 3, usw.
ALS es heißt ALS... :twisted:

Sorry, aber das hat mich immer schon bei meiner Ex-Freundin gestört :mrgreen:

(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 :mrgreen: )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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".
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@pillmuncher: Ja pfundig! :mrgreen:

Meine Ex war BWLerin und musste an der Uni "öch ma prögramieren, ne wa"...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oha... meine ist Krankenschwester und meckert nur über die Software, die sie benutzen müssen :mrgreen:

Ich sage dann immer, dass ich das besser hinbekommen würde und sie stimmt mir zu. Gott hab ich 's gut :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

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
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”. :-D
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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):
    ...
Zuletzt geändert von pillmuncher am Samstag 21. Februar 2015, 11:39, insgesamt 3-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

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?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und es sollte natürlich

Code: Alles auswählen

zip(c, c[1:])
sein und nicht

Code: Alles auswählen

zip(c, c[:1])
Sonst ist das Ergebnis etwas langweilig :D
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

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.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

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!
Antworten