in einer For-Schleife auf das übernächste Element zugreifen

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
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

Hallo zusammen

Heute habe ich ein altes Script von mir, mal wieder angeschaut und habe "vermeintliches" Verbesserungspotential entdeckt - sprich eine neue "Anforderung" kreiert.....

Bis jetzt habe ich zum Abarbeiten von DB Einträgen eine for-Schleife benutzt

Code: Alles auswählen

for elemente in Liste
    .....
das funktioniert auch super.

Neu sollte ich aber die zwei benachbarten elemente aus der Liste (Also Datensatz(x) und (x+1)) miteinander vergleichen.
Für solche "Anforderungen" habe ich bis jetzt mir einer "while"- Schleife gearbeitet.

Könnte ich dass auch mit einer "for"-Schliefe erledigen? - Wenn ja - Wie?

Freundliche Grüsse
Daniel
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Das kann man auf viele verschieden Methoden lösen.

Meine erste Wahl würde auf das fallen:

Code: Alles auswählen

for prev_element, next_element in zip(list_data[:-1], list_data[1:]):
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@ThomasL, mit enumerate müsste man über den index wieder auf die Liste zugreifen um das x+1. (index+1.) Element zu erhalten.
Für Python ist das etwas unschön und ist auch weniger performant.
Beim letzten Element gäbe es beim Zugriff auf das index+1. Element einen IndexError, den man allerdings umgehen kann, indem man von vornherein nur bis zum vorletzten iteriert.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

wie bei vielen solcher einfachen Aufgaben, gibt es passende Pakete.
Hier in more_itertools:

Code: Alles auswählen

for prev_element, next_element in more_itertools.pairwise(elements):
    ....
dll-live
User
Beiträge: 32
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

Hallo zusammen.

@Sirius3, @rogerb, @ThomasL
Besten Fank für eure Antworten und die möglichen Lösungen.

Eine Frage habe, ich noch - so nach dem Motto Hilfe zur Selbsthilfe...
Woher habt ihr das wissen?

Freundliche Grüsse
Daniel
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ein- oder mehrmals das hier komplett durcharbeiten:
https://docs.python.org/3/library/index.html
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn man ein X-elementiges Fenster über ein Iterable laufen lassen will / muss, geht das auch mit collections.deque. Beispiel für ein 2-elementiges Fenster aufeinanderfolgender Elemente:

Code: Alles auswählen

>>> from collections import deque
>>> data = [1, 2, 3, 4, 5, 6]
>>> d = deque(maxlen=2)
>>> for item in data:
...     d.append(item)
...     if len(d)==2:
...         print(d)
...
deque([1, 2], maxlen=2)
deque([2, 3], maxlen=2)
deque([3, 4], maxlen=2)
deque([4, 5], maxlen=2)
deque([5, 6], maxlen=2)
>>>
Wobei die Lösung von Sirius3 eleganter ist.
Woher habt ihr das wissen?
Wie ThomasL schon sagt: Doku lesen. Was mit auch geholfen hat: Python Module of the Week lesen (https://pymotw.com/3/). Und natürlich hier im Forum Lösung zu anderen Problemen mit lesen.

Gruß, noisefloor
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: statt innerhalb der for-Schleife zu warten, bis die deque gefüllt ist, würde ich sie vor der Schleife füllen:

Code: Alles auswählen

from itertools import islice
from collections import deque

data = [1, 2, 3, 4, 5, 6]
iterator = iter(data)
d = deque(islice(iterator, 2 - 1), maxlen=2)
for item in iterator:
    d.append(item)
    print(d)
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`more_itertools.pairwise()` ist übrigens ein ”Rezept” aus der Python-Dokumentation zum `itertools`-Modul. Und dort wird auch auf das externe `more_itertools` hingewiesen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten