假设
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
?
请帮忙
谢谢
试试这个,它适用于任何大小的列表:
all(e == a[0] for e in a)
请注意,您提出的使用
reduce
的解决方案不适用于两个以上的项目,因为第一次比较后的累积值是 True
,并且您将 True
与该点的每个元素进行比较上,显然这是行不通的。
您没有减少清单。 lambda 的返回值是
True
或 False
,然后将其用作输入参数以进一步调用同一 lambda 函数。 所以你最终将布尔值与列表进行比较。 因此,归约函数应该返回与其输入参数相同的类型。
您可能正在寻找其他建议的答案:使用
all()
。
你仍然可以使用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"
。
尝试一下。但是,此方法不适用于零列表。
因为第一次reduce比较[1,2,3] == [1,2,3],这是真的 下次比较 True 和 [1,2,3] 时结果为 false。
帮助(减少)
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).
a = [range(1, 4), range(1, 4), range(1, 4)]
要计算
reduce(operator.eq, a)
,reduce
函数将首先对 operator.eq
的前两个元素计算函数 a
,以获得 True
。 然后以operator.eq
和True
为两个参数再次调用range(1, 4)
,得到False
,即reduce
的最终结果。
也许你想要:
from functools import partial
from operator import eq
equalsa0 = partial(eq, a[0])
allequal = reduce(lambda sofar, nextone: sofar and equalsa0(nextone), a[1:], True)
这应该可行,但在我看来,使用
reduce
很尴尬。 除非你出于某种原因被迫使用reduce,否则这可能是一个改进:
from functools import partial
from operator import eq
equalsa0 = partial(eq, a[0])
allequal = all(equalsa0, a[1:])
为什么第二种情况,结果是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
将产生 True
或 False
,然后与 c
进行比较。