【问题标题】:Lambda functions with multiple conditions具有多个条件的 Lambda 函数
【发布时间】:2021-08-13 03:02:08
【问题描述】:

考虑以下代码 sn-p。

    ## Heading ##
    def pos(l):
        count_positive=0
        for i in l:
            if i>0:
                count_positive+=1
        return count_positive
    def even(l):
        count_even=0
        for i in l:
            if i%2==0:
                count_even+=1
        return count_even
    list_int=[[2,-3,-6,10],[10,34,26,87],[1,-2,-3,4]]
    list_int=sorted(list_int,key=lambda x: (pos(x),even(x)))
    print(list_int)

Lambda 函数不能有多个表达式。

但在上面的代码中,我尝试先根据正元素的数量然后根据偶数元素的数量对 2D 列表进行排序。这不是说 lambda 函数中有两个表达式吗?还是像我将这两个条件包含在一个元组中一样,它会被视为一个单一条件?

【问题讨论】:

    标签: python-3.x lambda


    【解决方案1】:

    这不是说lambda函数中有两个表达式吗?

    是的,有两个表达式,但只返回一个表达式。当你这样做时

    lambda x: (pos(x), even(x))
    

    您正在创建一个返回单个值的 lambda:一个包含两个元素的元组。您可以通过这样做来看到这一点

    f = lambda x: (pos(x), even(x))
    print(f([1, 2, 3, 4]))        # Outputs (4, 2)
    print(f([-1, -2, -3, -4]))    # Outputs (0, 2)
    

    由于它返回一个元组,因此当您将其用作 sorted 键时,它会使用 tuple comparison 进行比较。

    关于 lambdas,Python documentation

    [Lambdas] 在语法上仅限于单个表达式。

    表示你做不到

    f = lambda x: pos(x), even(x)
    # It'll be parsed as f = ((lambda x: pos(x)), (even(x)))
    
    f = lambda x: return pos(x); return even(x)
    # It'll throw a SyntaxError
    

    还是像我将这两个条件包含在一个元组中一样,它会被视为一个条件?

    不,因为这没有意义。仅当您将它们与运算符显式连接时才会考虑单个条件,例如加法:

    f = lambda x: pos(x) + even(x)
    # Sorts the lists based on the sum of the count of the positive
    # numbers with the count of the even numbers
    

    【讨论】:

      【解决方案2】:

      您有一个表达式 - 一个调用两个函数来获取其值的元组。一个“表达式”可以调用多个函数。

      “Lambda 函数不能有多个表达式”的意思是,如果您在 lambda 中不能有多个“代码行”,这意味着您不能执行以下操作:

      lambda x: print(x) return x+1
      

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 2017-12-09
        • 1970-01-01
        相关资源
        最近更新 更多