有没有办法根据条件将列表"分叉"为两个

Jos*_*aez 13 python list

我在团队的代码中看到过一次重复的模式,看起来像这样

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]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有某个功能(我已经环顾四周但却找不到它)会做这样的事情

numbers = [1, 2, 3, 4]
even_numbers, odd_numbers = fork(numbers, lambda x: x % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

所以,我正在寻找的这个函数,将接收一个iterable和一个函数,并返回两个列表,一个是匹配提供条件的值,另一个是没有的.

python的标准库有没有实现这个目标?

AKX*_*AKX 11

我通常称之为sift,但partition也很好.

另一个,itertools-less实现可能是

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)
Run Code Online (Sandbox Code Playgroud)

编辑:对于稍微复杂一点的实现,大约快30%(在我的Python安装上):

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)
Run Code Online (Sandbox Code Playgroud)