我正在尝试将值输入lambda,如果值连续5次超过某个限制我想从函数返回1,我使用过滤器,但每次执行if
语句。我应该如何使用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())
答案 0 :(得分:1)
如果您已经开始使用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
每次rpm超过最大值时都会增加,并且每次没有时都会设置为0。这给了我们最长rpms的最长条纹,我们用它来决定是返回1还是0。
编辑:对于python 3,您需要从reduce
导入functools
。例如,参见演示。
EDIT2:纠正了一些错误的逻辑。在这个新的例子中,如果满足最大条纹长度,acc
将继续递增,因此每当超过最大条纹长度时,结束谓词为真。有关实例,请参阅上面的演示链接。
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
答案 1 :(得分:0)
这不是你想要的吗?如果没有filter和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