Funktion bei Aenderung des Elements einer Liste aufrufen

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten