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:

因为bool('b')总是True因为'b'是一个非空字符串。

这是python中的运算符优先级表

请注意,即使and优先级高于in,您仍然不会得到您想要的,因为('b' and 'c') in x会减少到'c' in xsince '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 ...
于 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 回答