9

假设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

请帮忙

谢谢

4

6 回答 6

10

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

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

请注意,您提出的解决方案 usingreduce不适用于两个以上的项目,因为第一次比较后的累积值为True,并且您将从那时True起与每个元素进行比较,显然这不起作用。

于 2012-05-23T00:34:13.057 回答
3

没有减少列表。lambda 的返回值为Trueor False,然后将其用作输入参数以进一步调用相同的 lambda 函数。因此,您最终会将布尔值与列表进行比较。因此,归约函数应该返回与其输入参数相同的类型。

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

于 2012-05-23T00:35:42.707 回答
3

你仍然可以使用reduce!看看这个魔法:

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

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

试试看。但是,此方法不适用于零列表。

于 2018-07-31T21:12:47.033 回答
2

因为第一次减少比较 [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).
于 2012-05-23T00:37:28.407 回答
1

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

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

也许你想要:

from functools import partial
import operator
allequal = reduce(partial(operator.eq, a[0]), a[1:])
于 2012-05-23T00:40:27.187 回答
0

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

因为reduce(lambda x, y: x == y, (a, b, c, d))不代表(a == b) and (b == c) and (c == d);这意味着(((a == b) == c) == d)a == b将产生Trueor False,然后将其与c.

于 2012-05-23T00:54:34.733 回答