Seite 1 von 1
Funktion bei Aenderung des Elements einer Liste aufrufen
Verfasst: Mittwoch 7. Dezember 2011, 16:32
von mzh
Liste gegeben.
Ich möchte über die Elemente der Liste iterieren, und dann eine Funktion aufrufen, wenn das Element ändert, also beim ersten Auftreten von 'b'. Hab da schon was hingekriegt mit einem schleppenden Index, mit dem ich ein Element mit dem vorangehenden vergleichen kann, was allerdings eine mühsame Bedingung für das erste Element verlangt, dass ja keinen Vorgänger hat. Gibt es hier nicht eine elegante Lösung?
Re: Funktion bei Aenderung des Elements einer Liste aufrufen
Verfasst: Mittwoch 7. Dezember 2011, 16:39
von Hyperion
Bedeutet der erste Eintrag der Liste denn automatisch eine Änderung?
So, unter der Annahme, dass dem so ist, hier mal mein Vorschlag:
Code: Alles auswählen
>>> data = ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c']
>>> def foo(pair):
... print(pair)
...
>>> for pair in zip(data, chain([None], data)):
... if pair[0] != pair[1]:
... foo(pair)
...
('a', None)
('b', 'a')
('c', 'b')
``chain`` stammt aus den ``itertools``. Unter Python 2.x entsprechend ``print`` ändern unf ggf. auch ``izip`` aus den ``itertools`` importieren.
Re: Funktion bei Aenderung des Elements einer Liste aufrufen
Verfasst: Mittwoch 7. Dezember 2011, 16:56
von /me
mzh hat geschrieben:Ich möchte über die Elemente der Liste iterieren, und dann eine Funktion aufrufen, wenn das Element ändert, also beim ersten Auftreten von 'b'.
Brauchst du jedes einzelne Element oder reicht es dir wenn du weißt, wo die Wertänderungen sind?
Code: Alles auswählen
from itertools import groupby
data = ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'd', 'd']
groups = [(key, len(list(group))) for key, group in groupby(data)]
for element in groups:
print element
Re: Funktion bei Aenderung des Elements einer Liste aufrufen
Verfasst: Mittwoch 7. Dezember 2011, 17:26
von mzh
Code: Alles auswählen
from itertools import groupby
data = ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'd', 'd']
groups = [(key, len(list(group))) for key, group in groupby(data)]
for element in groups:
print element
[/quote]
Der ist ja hammer. Plus 1.