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
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.