1
>>> 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返されるのはなぜですか?trueb

4

4 に答える 4

5

あなたがしたい'b' in x and 'c' in x

演算子の仕組みを誤解していますand(また、演算子の優先順位が間違っています)。 inよりも優先順位が高いandため、式は次のように解析されます。

if 'b' and ('c' in x):

これは次と同じです:

if 'c' in x:

becausebool('b')は常にTruesince'b'は空でない文字列です。

これはPythonの演算子の優先順位の表です

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 ...
于 2012-08-22T14:18:24.607 に答える
5

これは、現在持っているものと同等です。

>>> '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'}

于 2012-08-22T14:20:00.533 に答える
0

'b'は真実であり、'c' in xまた真実でもあります。(True and True) == True. が必要'b' in x and 'c' in xです。

于 2012-08-22T14:20:34.737 に答える
0

andあなたが思っていることをしません。

'a' and 'c' in x

意味:

bool('a') and ('c' in x)

つまり:

True and True

これはTrueもちろん意味します:)

あなたがする必要があります:

('a' in x) and ('c' in x)
于 2012-08-22T14:21:22.780 に答える