2017-01-18 3 views
2

私はPythonでany()を使って、String[]配列とRedditのAPIから引き出されたコメントの間のマッチを探すのと同じように働いています。Pythonでany()にマッチしたものを見つける方法は?

現在、私はこのようにそれをやっている:

isMatch = any(string in comment.body for string in myStringArray) 

しかし、それはまた、単にisMatchがtrueの場合は知っているが、それは試合を持っていたことだったmyStringArrayのどの要素ではないに有用であろう。私の現在のアプローチでこれを行う方法はありますか、あるいはマッチを検索する別の方法を見つけなければなりませんか?

+4

:上記の回答のように、1つのステートメントでこれを行うためのクリエイティブな方法がありますが、それは本当にforループを使用することは理にかなっています'any'と明示的な' for'ループでチェックを行います。私はここに何の問題も見当たりません –

答えて

1

あなたは条件ジェネレータ式にdefault=Falsenextを使用することができます。

next((string for string in myStringArray if string in comment.body), default=False) 

一致する項目がない場合に、デフォルトが返されます(それはFalseを返すanyようなものだ)、それ以外の場合は最初に一致する項目が返されます。

これはほぼ同等である:

isMatch = False # variable to store the result 
for string in myStringArray: 
    if string in comment.body: 
     isMatch = string 
     break # after the first occurrence stop the for-loop. 

たり、異なる変数でisMatchwhatMatched持つようにしたい場合:

isMatch = False # variable to store the any result 
whatMatched = '' # variable to store the first match 
for string in myStringArray: 
    if string in comment.body: 
     isMatch = True 
     whatMatched = string 
     break # after the first occurrence stop the for-loop. 
+0

同じ変数にboolか一致した文字列を格納するのは本当に良い考えですか?これは、動的な型の方法を使いすぎているようです。 – brianpck

+1

'any'はただ見るだけですぐに理解できます。 'for'ループはそれほど悪くないでしょう。私はこれを1分間見てきましたが、それが機能していることを自分自身に納得させることはできません。それは悪い解決策になります。 –

+0

@ MarkRansom私は同等でなければならない 'next'のないバージョンを含めました。場合によっては、何が起こっているのかを理解するのに役立ちます。 :) – MSeifert

0

を私は明示的なループが最も明確であろうとのコメントに同意します。それはもともとisMatchTrueある場合

def remember(x): 
    global memory 
    memory = x 
    return True 

次にグローバルmemoryがマッチした文字列が含まれます、またはどのような値(もしあれば)を保持:

isMatch = any(string in comment.body and remember(string) for string in myStringArray) 
            ^^^^^^^^^^^^^^^^^^^^^ 

を:あなたそうのようなあなたの元をごまかすことができisMatchFalseの場合

+3

OPが解決しようとしている問題のために、これがユーモラスであることを願っています。 – brianpck

+0

グローバルは悪です。本当にこのテクニックを使用する場合は、一致を覚えておくメンバを持つクラスオブジェクトを作成します。 –

2

それは情報の2種類保存するために一つの変数を使用するのは良い考えではありません:かどうかの文字列が一致(bool)と、その文字列が何であるかをstringを)。

あなたは本当に唯一の2番目の情報が必要になります。単に削除

match = '' 
for string in myStringArray: 
    if string in comment.body: 
     match = string 
     break 

if match: 
    pass # do stuff 
+0

これを関数に入れると完璧です。 –

関連する問題