python中in在set和dict中的使用

在学习过程中,有用到判断元素是否在列表中,通常都使用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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kongfsszz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值