当前位置: 首页 > article >正文

Python 判断键是否存在字典中(新手入门、实战案例)

在早期的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'] )

26c28877ab2543f4a29d0b427dba4b91.png

 一、使用 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中" )

41e896a95d224137ae1afb6e72c8d1bc.png

二、使用 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中" )

1ced83d73a884c33a8184a640582195b.png

使用 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中" )

701057f79d8e4fe4af8019cbf28adb87.png

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中" )

e2d434a1888a4c2cb15dfe61d1147bfa.png

三、实战案例

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 - item
            if 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 result

sum = twoSum([2, 7, 11, 15], 9)
print( sum )
sum = twoSum([3,2,4], 6)
print( sum )
sum = twoSum([3,3], 6)
print( sum )

df002b8c07a943f1b3d273e469ccf6ee.png

四、总结

过尽千帆,依然算法。

1、在Python3中,dict.has_key()方法已经被废弃,不能再被使用。

2、在实际开发中,可以使用in关键字或dict.get()方法来判断键是否存在。

3、推荐用 in 关键字,简洁、高效,不容易出错。

 

 


http://www.kler.cn/news/367801.html

相关文章:

  • C#文件内容检索的功能
  • fetch: 取消请求、读取流、获取下载进度...
  • 【2024最新】渗透测试工具大全(超详细),收藏这一篇就够了!
  • 西瓜书《机器学习》符号表KaTex表示
  • logback日志脱敏后异步写入文件
  • vuex使用modules模块化
  • 【计网】从零开始认识IP协议 --- 理解网段划分,NAT策略,私有IP和公网IP,认识公网
  • HuggingFace应用——自然语言处理(1):什么是NLP?什么是Transformer?
  • 第23周Java主流框架入门-SpringMVC 3.拦截器
  • C++游戏开发中的多线程处理是否真的能够显著提高游戏性能?如果多个线程同时访问同一资源,会发生什么?如何避免数据竞争?|多线程|游戏开发|性能优化
  • 学习pytorch
  • Python RabbitMQ 消息队列监听
  • w001基于SpringBoot的在线拍卖系统
  • React Native 项目使用Expo模拟器运行iOS和Android
  • 【线下培训】龙信科技应邀参与了由教育部网络安全与执法虚拟教研室(中国刑事警察学院)举办的学术讲座
  • android手动用证书签名apk apksigner工具
  • Unity3D学习FPS游戏(2)简单场景、玩家移动控制
  • gin入门教程(2):go安装以及初始目录构建
  • 简化深度学习实验管理:批量训练和自动记录方案
  • 暴力匹配算法 (BF):字符串匹配算法的演进之路
  • springboot 网上影院订票系统-计算机毕业设计源码06993
  • 小程序视频SDK解决方案,提供个性化开发和特效定制设计
  • 笔记整理—linux驱动开发部分(1)驱动梗概
  • 第五十二章 安全元素的详细信息 - EncryptedData 详情
  • 【含开题报告+文档+PPT+源码】基于SpringBoot爱之屋摄影预约管理系统的设计与实现
  • Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具