pivot() equivalent

John Posner jjposner at optimum.net
Thu Mar 11 18:39:12 EST 2010


On 3/11/2010 6:16 PM, gundlach wrote:
> I *know* this already exists, but I can't remember where:
>
> def pivot(func, seq):
>    # I know, a good implementation shouldn't call func() twice per item
>    return ( (x for x in seq if func(x)), (x for x in seq if not
> func(x)) )
>
> I feel like I read a thread in which this was argued to death, and I
> can't find that either.
>
> The scenario: I have a sequence of lines from a file.  I want to split
> it into those lines that contain a substring, and those that don't.  I
> want it to be more efficient and prettier than
>
> with = [x for x in lines if substring in x]
> without = [x for x in lines if substring not in x]
>
> Does this exist?
>
> TIA,
> Michael

Try this:

 > type lines.txt
the
quick
brown
fox
jumps
over
the
lazy
dog

 > type pivot.py

def pivot(pivot_function, filename):
     a_list = []
     b_list = []
     for line in open(filename):
         target_list = a_list if pivot_function(line) else b_list
         target_list.append(line[:-1])
     return (a_list, b_list)

print pivot(lambda line: 'e' in line, "lines.txt")

 > python pivot.py
(['the', 'over', 'the'], ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog'])

-John



More information about the Python-list mailing list