>>> x = { 'a' : 'b' , 'c' : 'd' }
>>>'a' and 'c' in x
True
>>>'a' and 'b' in x
False
>>>'b' and 'c' in x
True
キーをチェックする場合、そのようなキーがない場合でもin <dict>
、最後に検索したキーがb
返されるのはなぜですか?true
b
>>> x = { 'a' : 'b' , 'c' : 'd' }
>>>'a' and 'c' in x
True
>>>'a' and 'b' in x
False
>>>'b' and 'c' in x
True
キーをチェックする場合、そのようなキーがない場合でもin <dict>
、最後に検索したキーがb
返されるのはなぜですか?true
b
あなたがしたい'b' in x and 'c' in x
演算子の仕組みを誤解していますand
(また、演算子の優先順位が間違っています)。 in
よりも優先順位が高いand
ため、式は次のように解析されます。
if 'b' and ('c' in x):
これは次と同じです:
if 'c' in x:
becausebool('b')
は常にTrue
since'b'
は空でない文字列です。
and
よりも優先順位が高かったとしても、リターン以降に減少するin
ため、必要なものを取得できないことに注意してください。('b' and 'c') in x
'c' in x
'b' and 'c'
'c'
式を書き直す 1 つの方法は次のとおりです。
if all( key in yourdict for key in ('b', 'c') ):
これはチェックするキーが 2 つだけの場合はやり過ぎですが、チェックするキーがさらにある場合はすぐに役立ちます。
最後のコメントとして、おそらく演算子チェーンを適用しようとしているでしょう (これは非常に優れています)。ただし、一部の演算子は連鎖にあまり適していません (in
はその 1 つです)。doのような式3 > 10 > 100 > 1000
は、いくつかの奇妙な python 黒魔術によって機能します。私の経験では、関係演算子は適切に連鎖します ('<','>','==','<=','>=') が、他の演算子のほとんどは直感的な方法で連鎖しません。一般に、
a operator b operator c operator ...
次と同等です。
(a operator b) and (b operator c) and (c operator ...
これは、現在持っているものと同等です。
>>> 'a' and ('c' in x)
True
>>> 'a' and ('b' in x)
False
>>> 'b' and ('c' in x)
True
代わりにこれが必要です:
>>> 'a' in x and 'c' in x
True
>>> 'a' in x and 'b' in x
False
>>> 'b' in x and 'c' in x
False
<=
または、セットと(サブセット) 演算子を使用できます。
>>> set(['a', 'c']) <= set(x.keys())
True
>>> set(['a', 'b']) <= set(x.keys())
False
>>> set(['b', 'c']) <= set(x.keys())
False
Python 2.7 以降では、set(['a', 'c'])
に置き換えることができます{'a', 'b'}
。
'b'
は真実であり、'c' in x
また真実でもあります。(True and True) == True
. が必要'b' in x and 'c' in x
です。
and
あなたが思っていることをしません。
'a' and 'c' in x
意味:
bool('a') and ('c' in x)
つまり:
True and True
これはTrue
もちろん意味します:)
あなたがする必要があります:
('a' in x) and ('c' in x)