11 python dictionary
我试图在字典中搜索键,但我忘了添加该keys()
功能.我仍然得到了预期的答案.
为什么这两个表达式的结果相同?
key in dict
Run Code Online (Sandbox Code Playgroud)
和
key in dict.keys()
Run Code Online (Sandbox Code Playgroud)
Ant*_*ala 26
要理解为什么key in dct
返回与key in dct.keys()
过去需要的结果相同的结果.历史上在Python 2,一个将测试的存在键在字典dct
与dct.has_key(key)
.对于Python 2.2来说,这是改变的,当首选的方式成为时key in dct
,它基本上做了同样的事情:
在一个小的相关变化中,
in
操作员现在使用字典,所以key in dict
现在相当于dict.has_key(key)
行为in
是根据__contains__
dunder方法在内部实现的.其行为记录在Python语言参考中 - 3数据模型:
object.__contains__(self, item)
被称为实施会员测试运营商.如果item为in
self
,则返回true ,否则返回false.对于映射对象,这应该考虑映射的键而不是值或键 - 项对. 对于未定义的对象,__contains__()
成员资格测试首先尝试迭代__iter__()
,然后是旧的序列迭代协议__getitem__()
,请参阅语言参考中的此部分.
(强调我的; Python中的字典是映射对象)
在Python 3中,在has_key
被完全删除方法,现在有的正确的方法来测试键的存在完全是key in dict
,为记录.
在与上述2的对比,key in dct.keys()
也从来没有正确的测试在字典中是否存在一个关键的途径.你的两个例子的结果确实是相同的,但是key in dct.keys()
在Python 3上稍微慢一点,而且在Python 2上非常慢.
key in dct
返回true,如果在几乎恒定的时间操作中key
找到一个键dct
- 无论是否有两个或一百万个键 - 它的时间复杂度在平均情况下是恒定的(O(1))
dct.keys()
在Python 2中创建了list
所有键; 并在Python 3中查看键; 这两个对象都理解了key in x
.使用Python 2,它适用于任何可迭代的 ; 迭代值,并True
在一个值等于给定值(此处key
)时返回.
实际上,在Python 2中,你发现key in dct.keys()
要慢得多key in dict
(key in dct.keys()
与键的数量成线性关系 - 它的运行时复杂度为O(n).)
在Python 3,dct.keys()
不会比慢得多key in key_list
的视图不会使键的列表,并且所述访问仍然是O(1) ,但在实践中这将是由至少一个恒定值慢,并且它还有7个字符,因此没有理由使用它,即使在Python 3上也是如此.