- A+

I have seen a pattern repeated a couple times in my team's code, it looks like this

`numbers = [1, 2, 3, 4] even_numbers = [n for n in numbers if n % 2 == 0] odd_numbers = [n for n in numbers if n % 2 != 0] `

I was wondering if there is a function somewhere (I have looked around but haven't been able to find it) that would do something like this

`numbers = [1, 2, 3, 4] even_numbers, odd_numbers = fork(numbers, lambda x: x % 2 == 0) `

So, this function I am looking for, would receive an iterable and a function, and return two lists, one would be the values that match a provided condition, and the other would be the ones that didn't.

Is there something around python's standard library that achieves this?

I usually call this `sift`

, but `partition`

is fine too.

Another, itertools-less implementation might be

`def sift(iterable, predicate): t = [] f = [] for value in iterable: (t if predicate(value) else f).append(value) return (t, f) even, odd = sift([1, 2, 3, 4, 5], lambda x: x % 2 == 0) `

EDIT: for a slightly more complex implementation that is about 30% faster (on my Python installation anyway):

`def sift2(iterable, predicate): t = [] f = [] ta = t.append fa = f.append for value in iterable: (ta if predicate(value) else fa)(value) return (t, f) `