如何从Python中的lambda获取布尔值?
问题描述:
我想给lambda提供值,如果值连续超过一定的限制5次我想从函数返回1,我使用过滤器,但每次执行if
语句。我应该如何使用lambda来实现它?请任何其他建议。如何从Python中的lambda获取布尔值?
rpm = [45,20,30,50,52,35,55,65]
rpm_limit=45
def check():
x, i = 0, 0
while i < len(rpm):
if (filter(lambda x: x > rpm_limit, rpm)): # rpm values will be feeded continuously
x=x+1
print("RPM: ",rpm[i])
if x >= 5:
return 1
else:
x=0
i += 1
return 0
print(check())
答
如果你使用lambda表达式死心塌地,我觉得reduce
是更适合你的目的。
def check():
max_consec = reduce(lambda acc, r: acc + 1 if r > rpm_limit else 0, rpm, 0)
return 1 if max_consec >= 5 else 0
这里是发生了什么事情:acc
得到每递增的转速超过最大时间,只要它不设置为0。这使我们过度的最大RPM包,我们用它来决定的最长连胜,如果我们返回1或0
编辑:为Python 3,您需要导入reduce
从functools
。以演示为例。
EDIT2:纠正了一些错误的逻辑。在这个新例子中,acc
将在contiune增加,如果最大条纹长度已满足,所以最终谓词是真的,只要最大条纹长度已被超过。查看上面的演示链接以查看实例。
def check():
max_consec = reduce(
lambda acc, r: acc + 1 if (r > rpm_limit or acc >= max_streak) else 0, rpm, 0)
return 1 if max_consec >= max_streak else 0
答
这不是你想要的吗?如果没有过滤器和lambda,可以创建一个新的0/1列表(如果超出限制,则为1)。之后,你只需要简单地概括:
rpm = [45,20,30,50,52,35,55,65]
rpm_limit=45
def check():
exceedLimit = [1 if x > rpm_limit else 0 for x in rpm]
return sum(exceedLimit)
print('RPM exceeded the limit %s times' % check())
返回:
RPM exceeded the limit 4 times
+0
如果连续超过5次转速限制,则不应该停止。 –
什么?你为什么要'lambda'?你期望你的'if filter(..):'做什么?请注意,在Python 3中,'if filter(...):'将总是被视为真*。另外,'filter'不会影响你传递给它的列表。 –
我需要一个lambda来检索一个值,它只是必须我必须围绕lambda构建它。我知道我可以将过滤器的值存储为一个列表,但是不可能检查连续的数值是否更大。 –
为什么这是必要的?再次,*你想在这里做什么*?我不清楚。 –