python减少检查所有元素是否相等

问题描述 投票:0回答:6

假设

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

请帮忙

谢谢

python reduce
6个回答
11
投票

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

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

请注意,您提出的使用

reduce
的解决方案不适用于两个以上的项目,因为第一次比较后的累积值是
True
,并且您将
True
与该点的每个元素进行比较上,显然这是行不通的。


5
投票

没有减少清单。 lambda 的返回值是

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

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

all()


4
投票

你仍然可以使用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"

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


2
投票

因为第一次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).

2
投票

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:])

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
将产生
True
False
,然后与
c
进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.