On 2 Dec 2005 18:34:12 -0800, [EMAIL PROTECTED] wrote: > >Bengt Richter wrote: >> It looks to me like itertools.groupby could get you close to what you want, >> e.g., (untested) >Ah, groupby. The generic string.split() equivalent. But the doc said >the input needs to be sorted. >
>>> seq = [3,1,4,'t',0,3,4,2,'t',3,1,4] >>> import itertools >>> def condition(item): return item=='t' ... >>> def dosomething(it): return 'doing something with %r'%list(it) ... >>> for condresult, acciter in itertools.groupby(seq, condition): ... if not condresult: ... dosomething(acciter) ... 'doing something with [3, 1, 4]' 'doing something with [0, 3, 4, 2]' 'doing something with [3, 1, 4]' I think the input only needs to be sorted if you a trying to group sorted subsequences of the input. I.e., you can't get them extracted together unless the condition is satisfied for a contiguous group, which only happens if the input is sorted. But AFAIK the grouping logic just scans and applies key condition and returns iterators for the subsequences that yield the same key function result, along with that result. So it's a general subsequence extractor. You just have to supply the key function to make the condition value change when a group ends and a new one begins. And the value can be arbitrary, or just toggle beween two values, e.g. >>> for condresult, acciter in itertools.groupby(range(20), lambda x:x%3==0 or >>> x==5): ... print '%6s: %r'%(condresult, list(acciter)) ... True: [0] False: [1, 2] True: [3] False: [4] True: [5, 6] False: [7, 8] True: [9] False: [10, 11] True: [12] False: [13, 14] True: [15] False: [16, 17] True: [18] False: [19] or a condresult that stays the same in groups, but every group result is different: >>> for condresult, acciter in itertools.groupby(range(20), lambda x:x//3): ... print '%6s: %r'%(condresult, list(acciter)) ... 0: [0, 1, 2] 1: [3, 4, 5] 2: [6, 7, 8] 3: [9, 10, 11] 4: [12, 13, 14] 5: [15, 16, 17] 6: [18, 19] Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list