这两种语法之间的区别是什么?字典get()

时间:2015-03-24 14:27:02

标签: python

def twoSum(self, num, target):
    d = {n:pos for pos, n in enumerate(num)}
    for i, n in enumerate(num):
        if d.get(target-n):   # 1
        # if target - n in d: # 2
            return (i+1, d[target-n]+1)
    return None

1和2的区别是什么?为什么结果不一样?

2 个答案:

答案 0 :(得分:7)

dict.get()会返回默认值None,除非您指定其他内容,或者键的值(如果存在)。您正在测试返回的值 None true value 。任何不是None或数字0或空容器的都是真的。请参阅truth value testing

这意味着,如果字典 具有密钥,但该密钥的值为0或空容器或None甚至False,则表示您的测试失败。

其他测试测试纯粹的密钥。然后,与密钥相关的值是什么并不重要。

比较

>>> d = {'foo': 0}
>>> d.get('foo')
0
>>> bool(d.get('foo'))
False
>>> 'foo' in d
True

对于您的具体情况,num中的第一个值始终将被赋予索引0,当测试为布尔值时, false

>>> num = 3, 2, 4
>>> d = {n:pos for pos, n in enumerate(num)}
>>> d
{2: 1, 3: 0, 4: 2}
>>> bool(d.get(3))
False

答案 1 :(得分:3)

请尝试以下代码:

if {'a': None}.get('a'):
  print "foo"
if 'a' in {'a': None}:
  print "bar"

由于None评估为False,因此第一个示例不会打印"foo"。但第二个示例始终打印"bar",因为键'a'位于字典中。