我在团队的代码中看到过一次重复的模式,看起来像这样
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)