【Python基础】字典dict和集合set

       今天看了一些python的字典和集合的文章,发觉底层有些东西自己不是很清楚,关于哈希和内存,网上搜了很多发现都是零星的说明,包括csdn里面都是很多杂乱的记录。通过自己搜集点东西把基础用法和实现原理都整理一下。有时自己遇到问题总想着先放下往下面看,最后一拖再拖也该把问题忘记了,更多时候应该以深度优先,把眼把前的问题整理、理解清楚。

一、字典

       字典是一种键---值映射类型,字典是一种随机存储类型,通过键可以迅速地查找到对应的值。

       1、创建与初始化        

创建:
info = {}         #性能上更优于dict(),原因为{}直接调用底层的C语言关键字,
                  #dict()是一个回调函数


info = dict()


list_a = ["str_1","str_2","str_3"]
list_b = [1,2,3]
dic_from_list = dict(zip(list_a,list_b)) #{"str_1":1,"str_2":2,"str_3":3}

初始化:
info = {"key_str":value}
info = dict(key_str = value)

性能上更优于dict(),原因为{}直接调用底层的C语言关键字,dict()是一个回调函数

https://www.cnblogs.com/xiaoerlang/p/10361001.html

这里引用一下,别人的相关内容,通过dis模块查看两种初始化方式的字节码,发现dict()是执行了一次函数调用工程,二者的执行时间也可以比较。关于dis和字节码我在另一篇文章进行介绍。

import dis
dis.dis("{ }")
<123>           32032
dis.dis("dict()")
LOAD_CONST      25449 (25449)
LOAD_GLOBAL     10536 (10536
from timeit import timeit
timeit("d = dict()")
0.14620208740234375
timeit("d={}")
0.04514813423156738

       前面说到字典是键-值对,具有O(1)复杂度的查找复杂度,这里说明一下其中的实现原理即为通过将键值(key)通过哈希函数,获得哈希值,对一个哈希表(也叫散列表)长度取余,对应到该表中的某个具体下标中,将其“值”value存储其中。其中dict的查找、删除都是同样的操作。 哈希就会存在哈希冲突,也就是取余数后,如果两个不同键值得东西找到了相同位置,python通过开放寻址方法来寻找可插入的地方。(注:哈希冲突还有一种链接法解决,这里我还没搞懂。写完这块有空学习一下原理     https://foofish.net/python_dict_implements.html 

        这里再次借鉴下别人的东西,大家对我某些说法存在迷惑时,可以再对照这篇文章看一下。

二、集合set

        set是一个无序且不重复的集合,集合也是通过哈希函数进行映射,将不同的键值存储到不同的位置。其实现原理上与dict一致,需要重点说明的一句是,在当哈希表中的数量过多时,需要扩充哈希表的长度,这个过多一般是指大于总长度的2/3时。

关于set的初始化:

s = set()

s = {11,22,33} 且{}用于创建空字典,不能用于创建空集合

s = set(['a','b','c']) 采用list进行创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值