在学习过程中,有用到判断元素是否在列表中,通常都使用in set(list)来判断
在字典中通常使用in dict来判断元素是否在字典的keys中
那么为什么不能直接用in list或者in dict.keys()呢,查阅问题发现,使用in list的效率极低,时间复杂度为O(n),属于顺序遍历。而set和dict的存储方式是以hash存储,时间复杂度在O(1)~O(n)之间
至于in dict.keys()为什么不使用,众说纷纭,有人说dict,keys()的数据结构和list一样,会导致耗时很长,有人说in dict和indict.keys()耗时相差不多。
dict1 = {'apple': 1, 'banana': 4, 'cabbage': 2}
list1 = [1, 2, 3]
print(type(dict1))
print(type(list1))
print(type(dict1.keys()))
'''
<class 'dict'>
<class 'list'>
<class 'dict_keys'>
'''
通过以上代码可知,dict.keys()是一个dict_keys类
通过python官方文档得知,现在的dict.keys()是一个字典视图对象,不是之前的list
如果所有值都是可哈希的,即 (键, 值) 对也是不重复且可哈希的,那么条目视图也会类似于集合。
并且此视图会根据字典的变化而变化,见python文档演示
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}
{'juice', 'sausage', 'bacon', 'spam'}
>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500
详情可见dict.keys()