pivot() equivalent

G

gundlach

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
 
J

John Posner

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
 
M

MRAB

gundlach said:
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?
The clearest way is just:

def pivot(func, seq):
with, without = [], []
for x in seq:
if func(x):
with.append(x)
else:
without.append(x)
return with, without
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top