2017-12-08 21 views
0

私はリストoperationsをフィルタリングするために、次の構文を使用する必要があります。私は条件を作成する機能を使用Pythonで条件として解釈される文字列を作成する方法は?

a = [ope for ope in operations if ope[0] == 1 and ope[1] == "test"] 

と:if文の条件は可変であり、複数の条件が含まれていてもよい

a = [ope for ope in operations if ope[0] == 1] 

文字列として返す:

>>>> c = makeCondition(**{"id": 1, "title": 'test'}) 
>>>> c 
"ope[0] == 1 and ope[1] == 'test'" 

を統合する方法はありますかリストフィルタリングに変数がありますか? (もちろん、c変数は、以下の例では、文字列として評価される)、このような何か:助けを

a = [ope for ope in operations if c] 

ありがとう!

+1

'a = [... if eval(c)]'を試したことがありますか? – Chris

+1

なぜ条件を文字列として作成するのですか?それを関数またはラムダにすることははるかに理にかなっています。 – tripleee

+0

'a = [...ならeval(c)]'が動作します、ありがとう@Chris!私がそれを受け入れることができるようにあなたのコメントを答えとして加えることを検討してください。 @トライプルー:私はあなたが意味するものを得ることはありません。基本的な構文例を教えてください。 – wiltomap

答えて

0

コメントしたとおり、文字列を式として扱うように変更する場合は、eval(string)を使用できます。

+0

evalを使うことは、ほとんど常に間違った解決策です。ここで問題は確かにラムダを使用して解決することができます –

2

evalは、unsafeと考えられ、一般的には回避される。

[filter][1]には機能を使用できます。このためには、テスト条件を関数に入れる必要があります。

list(filter(lambda n: (n % 3 == 0) and (n % 7 == 0), range(1, 101)) 

クールなこと:ここで

は、より多くのconsiceの方法がlambdasを使用することで3と7

def mult3(n): 
    return n % 3 == 0 

def mult7(n): 
    return n % 7 == 0 

def mult3_and_7(n): 
    return mult3(n) and mult7(n) 

list(filter(mult3_and_7, range(1, 101))) 

の倍数である1から100までの番号のリストを作成する例です次のようなフィルタをチェーンすることができます:

list(filter(lambda n: n % 3 == 0, filter(lambda n: n % 7 == 0, range(1, 101)))) 

これらはすべて[21, 42, 63, 84]

このアプローチは、複数の条件を明確に連鎖させるのに役立ちます。

+0

これは、ありがとう!しかし、私の場合は、TrueまたはFalseの値だけでなく、kwargsとして渡された辞書から各キーに関連付けられた値を収集する必要があります。 – wiltomap

+0

あなたの場合、 'makeCondition'は' ope'でハードコードされているようですが、これは 'makeCondition(some_list、** kwargs) - > bool'のようなものにリファクタリングできることを意味します。文字列を返すのではなく、テストは 'makeCondition'の内部で行われます。そうすれば、あなたはeaisly 'list(filter(makeCondition、ope))'を行うことができます。 –

+0

私はその件に関連する別の投稿を作成しました:https://stackoverflow.com/q/47769705/2508539再度、感謝します! – wiltomap

関連する問題