>>> 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
?
答案 0 :(得分:5)
您想要'b' in x and 'c' in x
您误解了and
运算符的工作原理(并且您的运算符优先级错误)。 in
的优先级高于and
,因此您的表达式解析为:
if 'b' and ('c' in x):
与:
相同if 'c' in x:
因为bool('b')
始终为True
,因为'b'
是非空字符串。
这是table of operator precedence in python
请注意,即使and
的优先级高于in
,您仍然无法获得所需内容,因为('b' and 'c') in x
会降低到'c' in x
,因为'b' and 'c'
1}}返回'c'
。
重写表达式的一种方法是:
if all( key in yourdict for key in ('b', 'c') ):
只需要检查2个键就太过分了,但如果你有更多的钥匙需要检查,它会很快变得有用。
作为最终评论,您可能正在尝试应用运算符链接(这非常简洁)。但是,有些运营商不适合链接(in
就是其中之一)。像3 > 10 > 100 > 1000
这样的表达式通过一些奇怪的蟒蛇黑魔法起作用。根据我的经验,关系运算符很好地链接('&lt;','&gt;','==','&lt; =','&gt; ='),但大多数其他运算符不会以某种方式链接很直观。一般来说,
a operator b operator c operator ...
相当于:
(a operator b) and (b operator c) and (c operator ...
答案 1 :(得分: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'}
。
答案 2 :(得分:0)
'b'
是真的,'c' in x
也是如此。 (True and True) == True
。您需要'b' in x and 'c' in x
。
答案 3 :(得分:0)
and
没有按照您的想法行事。
'a' and 'c' in x
表示:
bool('a') and ('c' in x)
表示:
True and True
当然意味着True
:)
你需要这样做:
('a' in x) and ('c' in x)