【问题标题】:python reduce function returns false for check same element in a list [duplicate]python reduce函数返回false以检查列表中的相同元素[重复]
【发布时间】:2020-02-23 09:11:26
【问题描述】:
>>> reduce(lambda x,y: x == y, [2,2,2,2,2])
False

我想检查列表中的每个元素是否相同,我认为这样做可以解决问题,但显然不是。你能解释一下为什么它返回 false 以及我应该如何解决它?

【问题讨论】:

    标签: python


    【解决方案1】:

    执行此操作的更简单方法是检查列表中不同元素的数量是否为 1

    len(set([2,2,2,2,2]))==1
    

    【讨论】:

      【解决方案2】:

      lambda 函数的第一个应用是2 == 2,它产生True。下一个应用程序是True == 2,即False。最后,lambda的最后两个应用是False == 2,又是False.

      如果列表的长度 >= 1,我会这样做:

      all(lst[0] == x for x in lst)
      

      【讨论】:

        【解决方案3】:

        在你给出的 lambda 函数中,x 是累加值,y 是数组中的每个元素。

        1. x: 2, y: 2, lambda 返回 True
        2. x: True, y: 2, lambda 返回 False
        3. ...
        4. x: False, y: 2, lambda 返回 False

        要修复它,您可以简单地使用len(set(arr)) == 1 来查看此数组中是否只有一个唯一元素。

        【讨论】:

        • 为什么链接到JS代码?
        【解决方案4】:

        如果你看at the docs

        reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)

        因此,reduce(lambda x,y: x == y, [2,2,2]) 的较小示例将是 (2==2)==2 将是 False

        【讨论】:

          【解决方案5】:

          如果在reduce操作期间打印xy的值:

          def f(x,y):
              print 'x=',x,'y=',y
              return x==y
          
          print reduce(f, [2,2,2,2,2])
          

          它输出:

          x= 2 y= 2
          x= True y= 2 #x 包含 True 因为它是 (x==y) 的结果,因此 2==2
          x= False y= 2 #x 包含 False,因为它是 (x==y) 的结果,因此 True==2
          x= 假 y= 2 #相同的原因
          假的

          为避免这种行为,您可以指定一个包含归约结果和前一个元素值的初始元素。

          类似

          def f(x,y):
              print 'x=',x, 'y=', y
              return (x[1]==None or (x[0] and x[1]==y), y)
          
          print reduce(f, [2,2,2,2,2], (True,None))
          

          这次它输出:

          x= (真,无) y= 2
          x= (真, 2) y= 2
          x= (真, 2) y= 2
          x= (真, 2) y= 2
          x= (真, 2) y= 2
          (对,2)

          在压缩的 lambda 形式中,它归结为:

          reduce(lambda x,y: (x[1]==None or (x[0] and x[1]==y), y), list, (True,None))[0]
          

          试试看

          l = [2,2,2,2,2]
          print reduce(lambda x,y: (x[1]==None or (x[0] and x[1]==y), y), l, (True,None))[0]
          l = [2,2,3,2,2]
          print reduce(lambda x,y: (x[1]==None or (x[0] and x[1]==y), y), l, (True,None))[0]
          

          正确
          假的

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-12
            • 1970-01-01
            • 2016-08-29
            • 2018-10-01
            • 2012-08-19
            • 2020-07-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多