Seite 1 von 1

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

Verfasst: Samstag 19. Juni 2021, 16:00
von dll-live
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

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

Verfasst: Samstag 19. Juni 2021, 16:09
von ThomasL

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

Verfasst: Samstag 19. Juni 2021, 16:15
von rogerb
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:]):

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

Verfasst: Samstag 19. Juni 2021, 16:49
von rogerb
@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.

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

Verfasst: Samstag 19. Juni 2021, 18:36
von Sirius3
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):
    ....

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

Verfasst: Montag 21. Juni 2021, 19:08
von dll-live
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

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

Verfasst: Dienstag 22. Juni 2021, 06:04
von ThomasL
Ein- oder mehrmals das hier komplett durcharbeiten:
https://docs.python.org/3/library/index.html

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

Verfasst: Dienstag 22. Juni 2021, 07:52
von noisefloor
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

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

Verfasst: Dienstag 22. Juni 2021, 08:03
von Sirius3
@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)

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

Verfasst: Dienstag 22. Juni 2021, 18:20
von __blackjack__
`more_itertools.pairwise()` ist übrigens ein ”Rezept” aus der Python-Dokumentation zum `itertools`-Modul. Und dort wird auch auf das externe `more_itertools` hingewiesen.