带复杂表达式的筛选器列表

2024-09-29 06:30:40 发布

您现在位置:Python中文网/ 问答频道 /正文

arr = [[2,6,8],[1,4,7],[3,3,4],[2,4,9],[3,3,7]]

array_analysis = lambda arr=[], evenOdd=True, no_doubles= True:list(i for i in arr if evenOdd == True len(set(i) % 2) if no_doubles == True len(set(i) !> 1)

# test it
print('test array', arr)
for evenOdd, no_doubles in ((True, True), (True, False), (False, True), (False, False)):
    print(evenOdd, no_doubles, array_analysis(arr, evenOdd, no_doubles))

我试图创建一个lambda函数,它将根据条件参数过滤数组列表。你知道吗

  • 如果所有lambda参数都是True,那么返回值应该是:[[1,4,7],[2,4,9]],因为数字集中没有全奇数或全偶数,也没有双精度。

  • 如果no_doublesFalse,它应该包括没有全部偶数或没有全部赔率的双打。返回值应该是[[1,4,7],[2,4,9],[3,3,4]]不包括集合[3,3,7],因为它都是奇数。

  • 如果oddEvenFalseno_double为false,则返回值应为所有数字,反之亦然。如果oddEvenFalseno_doubleTrue,返回值应该是[[3,3,4],[3,3,7]]

没有lambda

# filters all odd or all even
def oddEven(a):
    return [i for i in a if len(set(np.mod(i, 2)))!=2]

# filters doubles
def no_doubles(a):
    return [i for i in a if len(set(i))!>2]

def all_filters_combined(a):
    return oddEven(a) and no_doubles(a)

这几乎是我要找的,但它没有使用lambda,它不允许我选择,如果我想改变过滤。如何更改此代码以允许我在一个lambda函数中选择过滤器?你知道吗


Tags: lambdanoinfalsetrueforlenif
1条回答
网友
1楼 · 发布于 2024-09-29 06:30:40

我相信这正是你想要的。。。你知道吗

arr = [[2,6,8],[1,4,7],[3,3,4],[2,4,9],[3,3,7]]

foo = lambda arr, evenOdd, noDoubles: [ i for i in arr if not (evenOdd and (all(k % 2 == 1 for k in i) or all(k%2 == 0 for k in i))) and not (noDoubles and (len(i) != len(set(i))))]

print(foo(arr, False, False))
print(foo(arr, True, False))
print(foo(arr, False, True))
print(foo(arr, True, True))

 $ python3 foo.py
[[2, 6, 8], [1, 4, 7], [3, 3, 4], [2, 4, 9], [3, 3, 7]]
[[1, 4, 7], [3, 3, 4], [2, 4, 9]]
[[2, 6, 8], [1, 4, 7], [2, 4, 9]]
[[1, 4, 7], [2, 4, 9]]
 $

让我们把它分解一下。你知道吗

[ i for i in arr if ... ]-您可以使用列表理解来执行这样的过滤。我们只需要确保...根据元素正确地计算为TrueFalse。你知道吗

not (evenOdd and (all(k % 2 == 1 for k in i) or all(k%2 == 0 for k in i)))-这是偶数检验。如果evenOddFalse,那么语句将对True短路,这意味着不应该对元素进行过滤。如果evenOddTrue,那么all(k % 2 == 1 for k in i)测试i的每个元素是否为奇数(下一个测试检查偶数)。你知道吗

and-如果其中一个测试失败,则应过滤元素。你知道吗

not (noDoubles and (len(i) != len(set(i))))-如果noDoublesFalse,则表达式对True短路。如果noDoublesTrue,那么len(i) != len(set(i)))只是重复的脏测试。你知道吗

相关问题 更多 >