5

过滤器函数返回一个元素的子列表,这些元素对于给定的函数返回 true。是否可以在不同列表中获取返回 false 的元素列表,而无需再次遍历整个列表。

例子:

trueList,falseList = someFunc(trueOrFalseFunc,list)

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

4

4 回答 4

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)

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

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

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

list(evens)
> [0, 2, 4, 6, 8]
list(odds)
> [1, 3, 5, 7, 9]
于 2012-04-09T21:04:07.567 回答
3
def someFunc(trueorfalsefunc, l):
    trueList = []
    falseList = []
    for item in l:
        if trueorfalsefunc(item):
            trueList.append(item)
        else:
            falseList.append(item)
    return trueList, falseList

因此,例如:

>>> someFunc(bool, [1,2,0,"", "a"])
([1, 2, 'a'], [0, ''])
于 2012-04-09T20:38:06.060 回答
2

如果你想选择一个单行,你可以这样做:(我正在从字典切换到列表作为 Niklas B. 建议提高可读性)

>>> some_list=[True, False, True, False, False]
>>> reduce(lambda (true,false),x: (true + [x], false) if x else (true, false + [x]), some_list, ([],[]))
([True, True], [False, False, False])
于 2012-04-09T20:41:23.647 回答
1

您可以使用生成器理解,这应该有助于提高性能并促进更简洁的代码。不过,我真的不确定这是否会满足您程序的其余部分。这取决于您如何使用这些返回的结果。

trueList = (elem for elem in list if trueOrFalseFunc(elem) )
falseList = (elem for elem in list if elem not in trueList )
于 2012-04-09T21:13:58.860 回答