【发布时间】:2020-02-23 09:11:26
【问题描述】:
>>> reduce(lambda x,y: x == y, [2,2,2,2,2])
False
我想检查列表中的每个元素是否相同,我认为这样做可以解决问题,但显然不是。你能解释一下为什么它返回 false 以及我应该如何解决它?
【问题讨论】:
标签: python
>>> reduce(lambda x,y: x == y, [2,2,2,2,2])
False
我想检查列表中的每个元素是否相同,我认为这样做可以解决问题,但显然不是。你能解释一下为什么它返回 false 以及我应该如何解决它?
【问题讨论】:
标签: python
执行此操作的更简单方法是检查列表中不同元素的数量是否为 1
len(set([2,2,2,2,2]))==1
【讨论】:
lambda 函数的第一个应用是2 == 2,它产生True。下一个应用程序是True == 2,即False。最后,lambda的最后两个应用是False == 2,又是False.
如果列表的长度 >= 1,我会这样做:
all(lst[0] == x for x in lst)
【讨论】:
在你给出的 lambda 函数中,x 是累加值,y 是数组中的每个元素。
要修复它,您可以简单地使用len(set(arr)) == 1 来查看此数组中是否只有一个唯一元素。
【讨论】:
如果你看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
【讨论】:
如果在reduce操作期间打印x和y的值:
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]
正确
假的
【讨论】: