advice : how do you iterate with an acc ?

Bengt Richter bokr at oz.net
Sat Dec 3 03:17:15 CET 2005


On 2 Dec 2005 17:08:02 -0800, bonono at gmail.com wrote:

>
>vd12005 at yahoo.fr wrote:
>> hello,
>>
>> i'm wondering how people from here handle this, as i often encounter
>> something like:
>>
>> acc = []    # accumulator ;)
>> for line in fileinput.input():
>>     if condition(line):
>>         if acc:    #1
>>             doSomething(acc)    #1
>>         acc = []
>>     else:
>>         acc.append(line)
>> if acc:    #2
>>     doSomething(acc)    #2
>>
>> BTW i am particularly annoyed by #1 and #2 as it is a reptition, and i
>> think it is quite error prone, how will you do it in a pythonic way ?
>>
It looks to me like itertools.groupby could get you close to what you want,
e.g., (untested)

    import itertools
    for condresult, acciter in itertools.groupby(fileinput.imput(), condition):
        if not condresult:
            dosomething(list(acciter)) # or dosomething(acciter) if iterator is usable

IOW, groupy collects contiguous lines for which condition evaluates to a distinct
value. Assuming this is a funtion that returns only two distinct values (for true
and false, like True and False), then if I understand your program's logic, you
do nothing with the line(s) that actually satisfy the condition, you just trigger
on them as delimiters and want to process the nonempty groups of the other lines,
so the "if not condresult:" should select those. Groupby won't return an empty group AFAIK,
so you don't need to test for that. Also, you won't need the list call in list(acciter)
if your dosomething can accept an iterator instead of a list.

Regards,
Bengt Richter



More information about the Python-list mailing list