首页 > 解决方案 > 有没有办法根据条件将列表“分叉”成两个

问题描述

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

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]

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

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

所以,我正在寻找的这个函数将接收一个可迭代的函数和一个函数,并返回两个列表,一个是与提供的条件匹配的值,另一个是不匹配的值。

python的标准库周围有什么东西可以实现这一点吗?

标签: pythonlist

解决方案


我通常称之为这个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)

编辑:对于一个稍微复杂一点的实现,大约快 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)

推荐阅读