>>> 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:
因为bool('b')
总是True
因为'b'
是一个非空字符串。
请注意,即使and
优先级高于in
,您仍然不会得到您想要的,因为('b' and 'c') in x
会减少到'c' in x
since 'b' and 'c'
returns 'c'
。
重写表达式的一种方法是:
if all( key in yourdict for key in ('b', 'c') ):
这对于仅检查 2 个键来说是多余的,但如果您有更多键要检查,它很快就会变得有用。
作为最后的评论,您可能正在尝试应用运算符链接(这真的很整洁)。然而,一些运营商不适合链接(in
就是其中之一)。像这样的表达式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)