dict中var的奇怪行为

时间:2012-08-22 14:17:41

标签: python

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

4 个答案:

答案 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)