python reduce来检查所有元素是否相等

时间:2012-05-23 00:27:50

标签: python reduce

假设a = [[1,2,3],[1,2,3]] reduce(lambda x,y: x==y, a)返回True

但如果a = [[1,2,3],[1,2,3],[1,2,3]] reduce(lambda x,y: x==y, a)返回False

为什么在第二种情况下,结果是False

请帮助

感谢

6 个答案:

答案 0 :(得分:7)

试试这个,它适用于任何大小的列表:

all(e == a[0] for e in a)

请注意,使用reduce的建议解决方案不适用于两个以上的项目,因为第一次比较后的累计值为True,您将比较True从那一点开始反对每一个元素,显然这不起作用。

答案 1 :(得分:2)

减少列表。 lambda的返回值为TrueFalse,然后将其用作输入参数以进一步调用相同的lambda函数。所以你最终将布尔值与列表进行比较。因此,reduce函数应返回与输入参数相同的类型。

您可能正在寻找建议的其他答案:使用all()

答案 2 :(得分:1)

因为第一次减少比较[1,2,3] == [1,2,3],这是真的 下次它比较True和[1,2,3]而且它是假的。

  
    
      

帮助(减少)

    
  
Help on built-in function reduce in module __builtin__:

reduce(...)
    reduce(function, sequence[, initial]) -> value

    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).

答案 3 :(得分:1)

a = [range(1, 4), range(1, 4), range(1, 4)]

要评估reduce(operator.eq, a)reduce函数将首先评估operator.eq的前两个元素上的函数a以获取True。然后,它会以operator.eqTrue作为两个参数再次调用range(1, 4),并获取False,这是reduce的最终结果。

也许你想要:

from functools import partial
import operator
allequal = reduce(partial(operator.eq, a[0]), a[1:])

答案 4 :(得分:0)

  

为什么在第二种情况下,结果为假

因为reduce(lambda x, y: x == y, (a, b, c, d))并不代表(a == b) and (b == c) and (c == d);这意味着(((a == b) == c) == d)a == b将生成TrueFalse,然后将其与c进行比较。

答案 5 :(得分:0)

您仍然可以使用reduce!看看这个魔术:

bool(reduce(lambda x,y: (x==y)*x, a))

由于x==y的lambda的返回值为True或False,可以将其乘以输入,然后在下一次比较中使用,因为True*[1,2,3][1,2,3]。它也适用于字符串,True*"MyString""MyString"

尝试一下。但是,此方法不适用于零列表。