2017-07-27 1 views
2

は「および/または」場合ネストされたリストを作成し、さらにアクションを行うために、「または」と「と」の条件の両方が適用され、私は、コードに取り組んでいます文

a= ["john", "carlos", "22", "70"] 

if (("qjohn" or "carlos") in a) and (("272" or "70") in a): 
    print "true" 
else: 
    print "not true" 

出力:

not true 

私はこれを実行します。

a= ["john", "carlos", "22", "70"] 

if ("qjohn" or "cdarlos" in a) and ("272" or "d70" in a): 
    print "true" 
else: 
    print "not true" 

出力は"true"

です

**carlos and 70**は真であるべきですが、それは「真実ではありません」と表示されます。このエラーの原因は何ですか?ありがとう

+0

ない、非常にだまされやすい人と同じですが、同じ基本的な問題と情報:[どのように私は、複数の値に対して一つの変数をテストするのですか? ](https://stackoverflow.com/questions/15112125/how-do-i-test-one-variable-against-multiple-values) – glibdud

答えて

7

どちらの方法も正しくありません。

を最初の1がfalseの場合、それは唯一の第二引数を評価します。あなたがそれがないと思う何をやっていないので、短絡演算子である心またはしてください。第二は全くin有する封じ込めチェックを実行することはないしつつ、第1の非空の文字列の包含のために最初のケースのみをチェックするように

しかしながら、非空の文字列は、したがって、それは、常にTrueあります常にTrue

何が欲しいのです:

if ("qjohn" in a or "carlos" in a) and ("272" in a or "70" in a): 
    ... 

テストの項目が長かった場合は、項目テストTrueの1いったんanyorのようにも短絡を使用してorの繰り返しを避けることができます:

if any(x in a for x in case1) and any(x in a for x in case2): 
    ... 
+0

有用かもしれません:https:// stackoverflow。com/questions/16679272 /論理文の優先順位 - 非 - および - または - in-python – Darkaird

+0

詳細な説明とその動作について多くの感謝 –

1
b = set(a) 
if {"qjohn", "carlos"} & b and {"272", "70"} & b: 
    .... 

条件は、セットresulの交差点場合Trueあります空ではないセット(メンバーシップ・テスト)の中で、空でないセットの真実性をテストすることは、この点で非常に非凡です。

また

set.intersectionを使用して:

if {"qjohn", "carlos"}.insersection(a) and {"272", "70"}.insersection(a): 
    .... 
+0

'intersection'メソッドを使用する場合、事前計算する必要はありませんセット「b」。このメソッドは引数として任意のiterableを取ることができます。 '' qjohn''、 '' carlos''、 '' intersection(a) 'など(あなたがこれをやりたいかどうかは、' 'a''が最初にどれほど大きいかによって決まります) – chepner

+0

@chepnerありがとう。私はこれが過小評価されているという意見です。 –

0

両者が間違っています。あなたは論理が偽であると理解しました。

("qjohn" or "carlos") in a"qjohn" in a

"qjohn" or "cdarlos" in aと同等です"qjohn" or ("cdarlos" in a)

関連する問題