Sequence splitting

Lie Ryan lie.1296 at gmail.com
Fri Jul 3 09:16:35 CEST 2009


Brad wrote:
> On Jul 2, 9:40 pm, "Pablo Torres N." <tn.pa... at gmail.com> wrote:
>> If it is speed that we are after, it's my understanding that map and
>> filter are faster than iterating with the for statement (and also
>> faster than list comprehensions).  So here is a rewrite:
>>
>> def split(seq, func=bool):
>>         t = filter(func, seq)
>>         f = filter(lambda x: not func(x), seq)
>>         return list(t), list(f)
>>
> 
> In my simple tests, that takes 1.8x as long as the original solution.
> Better than the itertools solution, when "func" is short and fast. I
> think the solution here would worse if func was more complex.
> 
> Either way, what I am still wondering is if people would find a built-
> in implementation useful?
> 
> -Brad

A built-in/itertools should always try to provide the general solution
to be as useful as possible, something like this:

def group(seq, func=bool):
    ret = {}
    for item in seq:
        fitem = func(item)
        try:
            ret[fitem].append(item)
        except KeyError:
            ret[fitem] = [item]
    return ret

definitely won't be faster, but it is a much more general solution.
Basically, the function allows you to group sequences based on the
result of func(item). It is similar to itertools.groupby() except that
this also group non-contiguous items.



More information about the Python-list mailing list