一次通过过滤和未过滤的元素

Gra*_*ddy 4 python functional-programming

Filter函数返回元素的子列表,该子列表对给定函数返回true.是否可以获取在不同列表中返回false的元素列表,而无需再次遍历整个列表.

例:

trueList,falseList = someFunc(trueOrFalseFunc,list)

PS:我知道可以通过初始化两个空列表并根据函数的返回值向每个列表附加元素来完成.正在考虑的列表可能非常巨大,可能很少有元素可能返回true.由于附加功能成本高昂,有没有更好的方法呢?

Ósc*_*pez 5

试试这个,使用迭代器:

from itertools import tee

def partition(lst, pred):
    l1, l2 = tee((pred(e), e) for e in lst)
    return (x for cond, x in l1 if cond), (x for cond, x in l2 if not cond)
Run Code Online (Sandbox Code Playgroud)

像这样使用它,并记住返回的值是迭代器:

lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
evens, odds = partition(lst, lambda x: x%2 == 0)
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因需要列表,请执行以下操作:

list(evens)
> [0, 2, 4, 6, 8]
list(odds)
> [1, 3, 5, 7, 9]
Run Code Online (Sandbox Code Playgroud)

  • 优雅的解决方案:) +1 (2认同)