2017-03-17 3 views
-2

私はPythonの初心者です。文字列が別の文字列の部分文字列かどうかを調べるために "in"という単語が使われていることがわかりました。しかし、このように「in」を使用すると、何かワイヤリングが発生しました。Pythonの "in"キーワードの何が問題なのですか?

Input: 

c=['1234444', '56788888', '99999900'] 
print "dddd" in c[0] 
print "ffffff" in c[1] 
print np.arange(len(c)-1) 
if((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1)): 
    print c 
    print "Something wrong" 

Output: 

False 
False 
[0 1] 
['1234444', '56788888', '99999900'] 
Something wrong 

なぜif節が "True"なのですか?それは間違ってはいけませんか?誰も私を助けることができますか?前もって感謝します。

答えて

1

ジェネレータ式を生成しましたが、ループしません。ジェネレータオブジェクトは「空ではない」のでTrueです。そうでなければジェネレータ式の式は決して実行されません。例えば

>>> gen = (False for _ in range(0)) # always false *and* empty 
>>> bool(gen) 
True 

はおそらく、あなたがany() functionを探していましたか?それは、その引数を反復し、その値のいずれかに該当する場合Trueを返します:

if any("ddd" in c[i] and "fffff" in c[i+1]) for i in np.arange(len(c)-1)): 
    print "Never reached" 

対応all() functionがあります。

2

この

((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1)) 

は発電機です。あなたは

if((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1)) 

を行う場合

あなたは基本的にそれは、「この発電機は何か*である」と言って、発電機を反復処理されていません。

(*「何か」がNoneまたはゼロまたは空の容器または一部そうfalseyオブジェクトではない場合)

あなたは発電機のすべてが真であることを確認したい場合は、allを使用することができます。発電機に何かが真であるかどうかをチェックしたい場合は

if all((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1)) 

、あなたはanyを使用することができます。

if any((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1)) 
1

あなたの質問とは異なるアプローチです。

あなたは("ddd" in c[i])を入力しています。これは "False"を返し、("fffff" in c[i+1])は "False"のif文を生成します。だから、基本的にあなたが、今はFalse Falseを

if((False and False)for i in np.arange(len(c)-1)): 

を言っているの

= Falseの

>>> False and False 
False 

だからあなたの文は、リスト内包の上

if(False for i in np.arange(len(c)-1)): 

に削減に相当している場合:

temp = [] 
for i in np.arange(len(c)-1): 
temp.append(False) 

上記の結果はTrueです。つまり、forループの繰り返しごとに「False」を追加しています。
したがって、if内の次の文が実行されます。

print c 
print "Something wrong" 
関連する問題