- 此问题在此处已有答案**:
Check if a given key already exists in a dictionary(16个答案)
15小时前关门了。
我有一个Python字典,比如mydict = {'name':'abc','city':'xyz','country','def'}
。
我应该如何检查一个键是否在字典中?我已经知道这些方法:if mydict.has_key('name'):
if 'name' in mydict:
Check if a given key already exists in a dictionary(16个答案)
15小时前关门了。
我有一个Python字典,比如mydict = {'name':'abc','city':'xyz','country','def'}
。
我应该如何检查一个键是否在字典中?我已经知道这些方法:if mydict.has_key('name'):
if 'name' in mydict:
4条答案
按热度按时间ki1q1bka1#
是首选的Python版本,不鼓励使用
has_key()
,这个方法在Python 3中已经被删除了。eqqqjvef2#
和martineau的回答一样,最好的解决方案通常是不检查。
通常被写入
更短更直接地表达你的意思。
另一个常见的例子是
可以重写
或者通过使用
collections.defaultdict(list)
作为d
并写入vdgimpew3#
在字节码方面,
in
保存了一个LOAD_ATTR
,并用一个COMPARE_OP
替换了一个CALL_FUNCTION
。我的感觉是
in
的可读性要强得多,在我能想到的每一种情况下都是首选。就性能而言,计时反映了操作码
in
几乎快了两倍。nwlls2ji4#
我的回答是“都不是”。
我相信最“Python”的做事方式是不事先检查键是否在字典中,而是只编写假设它在那里的代码,并捕捉任何因为它不在而引发的KeyError。
这通常是通过将代码封装在
try...except
子句中来完成的,这是一个众所周知的习惯用法,通常表示为“请求原谅比请求许可容易”或缩写为EAFP,这基本上意味着最好尝试一些东西并捕获错误,而不是在做任何事情之前确保一切正常。当你可以优雅地处理异常而不是试图避免它们时,你就不需要验证了吗?因为如果键不存在的可能性很低(或者不管有什么先决条件),那么它通常更具可读性,代码也会更快。当然,这并不适用于所有情况,也不是每个人都同意这种哲学,所以你需要根据具体情况自己决定。毫不奇怪,与此相反的是LBYL,意思是“三思而后行”。
举个简单的例子:
对比
虽然在这种情况下,它的代码量几乎完全相同,但第二种方法不需要先花时间检查,而且可能会稍微快一些(尝试......尽管block并不是完全免费的,所以在这里可能不会有太大的区别)。
一般来说,提前测试通常会涉及更多的内容,不做测试可以节省大量成本。也就是说,基于其他答案中所述的原因,
if 'name' in dict:
更好。如果您对该主题感兴趣,请阅读标题为“EAFP vs LBYL(回复:到目前为止有点失望)”可能比我在这里更好地解释了这两种方法之间的区别。Alex Martelli的书Python in a Nutshell, 2nd Ed在关于异常的第6章中也有关于这两种方法的很好的讨论,书名为Error-Checking Strategies。(我看到现在有一个更新的3rd edition,发布于2017年,它涵盖了Python 2.7和Python 3.x)。