Seite 1 von 1

Funktion bei Aenderung des Elements einer Liste aufrufen

Verfasst: Mittwoch 7. Dezember 2011, 16:32
von mzh
Liste gegeben.

Code: Alles auswählen

data = ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b']
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.