如何从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()) 
+1

什么?你为什么要'lambda'?你期望你的'if filter(..):'做什么?请注意,在Python 3中,'if filter(...):'将总是被视为真*。另外,'filter'不会影响你传递给它的列表。 –

+0

我需要一个lambda来检索一个值,它只是必须我必须围绕lambda构建它。我知道我可以将过滤器的值存储为一个列表,但是不可能检查连续的数值是否更大。 –

+0

为什么这是必要的?再次,*你想在这里做什么*?我不清楚。 –

如果你使用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

demo

编辑:为Python 3,您需要导入reducefunctools。以演示为例。

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 
+0

是的,这就是我需要感谢我长时间坚持的解决方案。我试图“减少”,但不是这样。 –

+1

等等,其实这是错误的。如果列表末尾出现低转速,则累加器将被重置。给我一分钟重新思考。 – Will

+0

用修正的逻辑发布编辑。 [Demo link](https://repl.it/JMC0/1)也已更新。 – Will

这不是你想要的吗?如果没有过滤器和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次转速限制,则不应该停止。 –