2013-06-06 2 views
6
>>> [l for l in range(2,100) if litheor(l)!=l in sieve(100)] 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 
>>> 2 in sieve(100) 
True 
>>> litheor(2) 
True 

だからlitheor(2)True2 in sieve(100)Trueあるので、リスト内包でif句はFalseです。しかし、なぜ2はまだリストの理解の出力にありますか?Python:リストの理解のどこかで何かが間違っていましたか?

答えて

11

[OK]を、最初のそれはクレイジーに聞こえるが、時:

>>> ast.dump(ast.parse("True != 2 in [2,3,5]")) 
"Module(body=[Expr(value= 
Compare(left=Name(id='True', ctx=Load()), ops=[NotEq(), In()], comparators=[Num(n=2), List(elts=[Num(n=2), Num(n=3), Num(n=5)], ctx=Load())]) 
)])" 

>>> True != 2 in [2,3,5] 
True 
>>> (True != 2) in [2,3,5] 
False 
>>> True != (2 in [2,3,5]) 
False 

あなたは、これは、単純な優先順位の問題ではないことを認識し、ASTを見ていると、唯一の残りのオプションです

>>> ast.dump(ast.parse("1 < 2 <= 3")) 
'Module(body=[Expr(value= 
Compare(left=Num(n=1), ops=[Lt(), LtE()], comparators=[Num(n=2), Num(n=3)]) 
)])' 

だから、それは結局のところ、True != 2 in [2,3,5]が同様に解釈されます。そして、ここで少しヒントです1 < 2 <= 3になります。そして、あなたの表現

litheor(l) != l in sieve(100) 

Trueある

litheor(l) != l and l in sieve(100) 

を意味します。

+0

ありがとうございました。しかし、1はふるい(100)にはない。間違っているかもしれないことは他にありますか? –

+0

@SylvesterVLowellまあ、以下のいずれかであるかもしれません:1) 'sieve(100)'は整数だけでなくブール値 'True'も含みます。 2) 'litheor(2)'はブール値の代わりに '2'を返し、' 0'を含む 'sieve(100)'を返します。私は他の選択肢を見ることができません。あなたは 'ふるい'と 'litheor'の定義を教えてください。 – kirelagin

+0

@シルベスターVロウェルああ待って...あなたは正しい...それは完全に狂っている... – kirelagin

関連する問題