2017-03-27 8 views
0

私はリストの解説と文字列で面白いシナリオを実行しています。ここでは、シナリオの簡単な例です:Pythonリストの文字列での理解

この:

banned = ['apple', 'pear'] 
sentence = 'I will eat an apple'  
if(not x in sentence for x in banned): print('ok') 

戻り値:

ok 

'りんご' は文中に表示されていても。私は理解を間違って書いたことがありますか? 「禁止」の単語が「文章」に含まれている場合、「ok」は印刷されません。

+1

非空のリストは、(どんな値)あなたは 'ALL'キーワードの後に​​しているtruthy – FamousJameous

+7

ある - 'すべての場合(禁止中のxについての文章ではないのx):プリント( 'OK') ' – asongtoruin

+1

'x not in sentence'を使った方が少しはっきりしています – barny

答えて

1

次の部分:

(not x in sentence for x in banned) 

にかかわらず、コンテンツが何であれの、Trueとして評価されるジェネレータ式です。

複数の項目の真理値をチェックする場合は、問題に応じてanyまたはallのいずれかの機能を使用することができます。

あなたがall()が必要と思われる。この場合:

banned = ['apple', 'pear'] 
sentence = 'I will eat an apple'  
if all(x not in sentence for x in banned): 
    print('ok') 

または、一部x not in sentenceは文字列全体ではなく、その言葉の中にメンバーシップをチェックすることに注意してください。つまり、入力文字列内の単語の1つにbannedの単語が含まれている場合はTrueを返します。単語pearを含むpearlのように。

この問題を回避する1つの方法は、分割されたテキストのメンバーシップをチェックするか、正規表現を使用することです。

もう一つの選択肢は、setとの交点を使用して次のようになります。ジャンFrançoisFabreが、それはあなたがちょうど交差点を確認したいので、set.isdisjoint()ではなくset.intersectionを使用することをお勧めします言及

banned = {'apple', 'pear'} # use set instead of list 
sentence = 'I will eat an apple' 
if banned.intersection(sentence.split()): 
    print('ok') 

@として。

banned = {'apple', 'pear'} # use set instead of list 
sentence = 'I will eat an apple' 
if not banned.isdisjoint(sentence.split()): 
    print('ok') 
+0

'もしbanned.intersection(sentence.split()):'は 'set'を作成しますが、これは無駄です。条件として '禁止されていません.isdisjoint()'を使用する方がいいです。 –

+0

@ Jean-FrançoisFabre 'isdisjoint()'はこの問題に対して正しい結果を返しません。 'banned.isdisjoint( 'apple pear banana'.split())'を試してください。 – Kasramvd

+0

私は 'not {'apple'、 'pear'}と書いた。isdisjoint( 'apple pear banana'.split())'。 isdisjointは交差点が空でないことを意味しません。それは動作します。 –

関連する問題