This is a prefect use case for the good old "reduce" function: --BEGIN SNAP
a_lst = [None,0,0,1,1,1,2,2,3,3,3,2,2,2,4,4,4,5] def straightforward_collapse(lst): return reduce(lambda v,e: v[-1]!=e and v+[e] or v, lst[1:], [lst[0]]) def straightforward_collapse_secu(lst): return lst and reduce(lambda v,e: v[-1]!=e and v+[e] or v, lst[1:], [lst[0]]) or [] print straightforward_collapse(a_lst) print straightforward_collapse_secu([]) --END SNAP Regards Francis Girard Le vendredi 4 Février 2005 20:08, Steven Bethard a écrit : > Mike C. Fletcher wrote: > > Alan McIntyre wrote: > > ... > > > >> I have a list of items that has contiguous repetitions of values, but > >> the number and location of the repetitions is not important, so I just > >> need to strip them out. For example, if my original list is > >> [0,0,1,1,1,2,2,3,3,3,2,2,2,4,4,4,5], I want to end up with > >> [0,1,2,3,2,4,5]. > > > > ... > > > >> Is there an elegant way to do this, or should I just stick with the > >> code above? > >> > > >>> def changes( dataset ): > > > > ... last = None > > ... for value in dataset: > > ... if value != last: > > ... yield value > > ... last = value > > ... >>> print list(changes(data )) > > > > which is quite readable/elegant IMO. > > But fails if the list starts with None: > > py> lst = [None,0,0,1,1,1,2,2,3,3,3,2,2,2,4,4,4,5] > py> def changes(dataset): > ... last = None > ... for value in dataset: > ... if value != last: > ... yield value > ... last = value > ... > py> list(changes(lst)) > [0, 1, 2, 3, 2, 4, 5] > > A minor modification that does appear to work: > > py> def changes(dataset): > ... last = object() > ... for value in dataset: > ... if value != last: > ... yield value > ... last = value > ... > py> list(changes(lst)) > [None, 0, 1, 2, 3, 2, 4, 5] > > STeVe -- http://mail.python.org/mailman/listinfo/python-list