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的区别是什么?为什么结果不一样?
答案 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'
位于字典中。