在早期的Python2版本中,可以使用
dict.has_key()
方法来判断一个键是否存在于字典中。在Python3中,
dict.has_key()
方法被废弃了,不能再被使用。如果在Python3中尝试使用dict.has_key()
方法会导致AttributeError
异常。那在Python3中要如何判断一个键是否存在于字典中呢?
student = {'name': '小明', 'age': 30, 'gender': 'male'}
if ( student.has_key('name') ):print( studnet['name'] )
一、使用 in 关键字来判断(推荐)
student = {'name': '小明', 'age': 30, 'gender': 'male'}
if 'name' in student:print( "键 'name' 存在于字典student中" )
else:print( "键 'name' 不存在于字典student中" )
if 'grade' in student:print( "键 'grade' 存在于字典student中" )
else:print( "键 'grade' 不存在于字典student中" )
二、使用 dict.get() 方法
dict.get(key[, default=None])
返回指定键所对应的值,如果键不在字典中返回default值, default 默认为 None
student = {'name': '小明', 'age': 30, 'gender': 'male'}
if student.get('name'):print( "键 'name' 存在于字典student中" )
else:print( "键 'name' 不存在于字典student中" )
if student.get('grade'):print( "键 'grade' 存在于字典student中" )
else:print( "键 'grade' 不存在于字典student中" )
使用 dict.get() 有一个不好的地方,就是当 key 不存在于字典当中的时候,结果返回 None,
这个在 if 判断的时候,会跟 0 产生一些混淆,造成预期外的BUG
student = {'name': '小明', 'age': 30, 'gender': 'male', 'score': 0}
if student.get('score'):print( "键 'score' 存在于字典student中" )
else:print( "键 'score' 不存在于字典student中" )
score 键是存在于字典中的,但是结果却说不存在。
造成这个问题的原因,是 score 的值是 0,它在 if 判断的时候跟 None 一样,都被判定为 false,解决问题的方式,就是 student.get('score') != None 人为显式地判空,但是这样就不如 in 关键字来的简洁。
student = {'name': '小明', 'age': 30, 'gender': 'male', 'score': 0}
if student.get('score') != None:print( "键 'score' 存在于字典student中" )
else:print( "键 'score' 不存在于字典student中" )
三、实战案例
leecode 第一题:
两数之和
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
解题的思路,就是利用字典的 key 来保存 nums 的值,用字典的 value 来保存 nums 的索引。通过字典的 hash 定位,快速查找到符合 target - item 表达式的 索引。
时间复杂度为 O(n) 只有一次遍历。
def twoSum(nums, target):result = []my_dict = {}for i in range( len(nums) ):item = nums[i]other = target - itemif my_dict.get(other) != None:result.append( my_dict.get(other) ) result.append( i )return result# 这两种写法都可以# if my_dict.get( item ) == None: if item not in my_dict:my_dict[item] = i return resultsum = twoSum([2, 7, 11, 15], 9)
print( sum )
sum = twoSum([3,2,4], 6)
print( sum )
sum = twoSum([3,3], 6)
print( sum )
四、总结
过尽千帆,依然算法。
1、在Python3中,
dict.has_key()
方法已经被废弃,不能再被使用。2、在实际开发中,可以使用in关键字或
dict.get()
方法来判断键是否存在。3、推荐用 in 关键字,简洁、高效,不容易出错。