2017-07-03 16 views
0

私はラムダに値を供給しようとしていますが、値が一定の限界を5回連続して超えた場合、関数から1を返したいと思いますが、if文が実行されるたびにフィルタを使用しています。ラムダを使って実装する方法は?他の提案をしてください。Pythonでlambdaからboolean値を取得する方法は?

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

何ですか?なぜラムダが欲しいのですか?あなたの '' if filter(..): 'は何をするのですか? Python 3では 'if filter(...):'は常にtrueとみなされます。また、 'filter'はあなたが渡すリストに影響しません。 –

+0

値を1つずつ取り出すためにはラムダが必要ですが、ラムダの周りにそれを構築する必要があります。私はリストからフィルターの値を格納することができますが、それは連続した値を確認することはできませんが大きいではないことを知っている。 –

+0

なぜそれが必要ですか?もう一度、*あなたはここで何をしようとしていますか?それは私には分かりません。 –

答えて

1

、私は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に設定されます。 Pythonの3のために、あなたはreduceをインポートする必要があります:私たちは1または0

demo

EDITを返す場合、これは我々が決めるのに使用オーバーザ最大のRPMの最長連勝を与えます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 
+0

それは私が長い間詰まっていた解決策に感謝しました。私は 'reduce'を試みていましたが、このようにはしませんでした。 –

+1

お待ちください、実際これは間違っています。アキュムレータは、リストの末尾に低いrpmが表示された場合にリセットされます。再考する時間をください。 – Will

+0

修正されたロジックを含む編集を投稿しました。 [デモリンク](https://repl.it/JMC0/1)も更新されました。 – Will

0

それはあなたが望むものではありませんか?フィルタとラムダがなければ、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

rpmの制限を5回連続して超えた場合は、それを停止する必要はありません。 –

関連する問題