python dict hash算法_【python从入门到放弃】2.dict&set

文章目录

1.dict

python内置了字典:dict 的支持(在其他的语言中也称为map,使用健-值 key-value 存储)

例:

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}

>>> d['Michael']

95

把数据放到dict的方法,除了初始化时指定外,还可以通过key放入

例:

>>> d['Adam'] = 67

>>> d['Adam']

67

如果key不存在,dict就会报错

要避免key不存在的错误,有两种办法,一是通过 in 判断 key 是否存在

例:

>>> 'Thomas' in d

False

二是通过 dict 提供的 get() 方法,如果 key 不存在,可以返回 None ,或者自己指定的value(注:返回 None 的时候python的交互环境不显示结果)

例:

>>> d.get('Thomas')

>>> d.get('Thomas', -1)

-1

删除一个 key ,pop(key) 方法,对应的 value 也会从 dict 中删除

例:

>>> d.pop('Bob')

75

>>> d

{'Michael': 95, 'Tracy': 85}

dict 内部存放的顺序和 key 放入的顺序是没有关系的

和 list 相比,dict 的特点:(用空间换时间)

1.插入和查找的速度极快,不会随着 key 的增加而变慢

2.需要占用大量的内存,内存浪费多

而list相反:

1.查找和插入的时间随着元素的增加而增加

2.占用空间小,浪费内存很少

dict的 key 必须是不可变对象(因为dict根据key来计算value的存储位置,这个通过 key 计算位置的算法称为哈希算法)

2.set

set 和 dict 类似,也是一组 key 的集合,但不存储 value。在 set 中,没有重复的 key,是一系列无序的、唯一的元素组合。

要创建一个 set ,需要提供一个 list 作为输入集合

例:

>>> s = set([1, 2, 3])

>>> s

{1, 2, 3}

传入的参数[1,2,3]是一个list,而显示的{1,2,3}只是告诉你这个 set 内部有1,2,3这3个元素,显示的顺序也不表示 set 是有序的

重复的元素在 set 中自动被过滤

通过 add(key) 方法可以添加元素到 set 中,可以重复添加,但不会有效果:

>>> s.add(4)

>>> s

{1, 2, 3, 4}

>>> s.add(4)

>>> s

{1, 2, 3, 4}

通过remove(key) 方法可以删除元素:

>>> s.remove(4)

>>> s

{1, 2, 3}

set 可以看成数学意义上的无序和无重复元素的集合,因此,两个 set 可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])

>>> s2 = set([2, 3, 4])

>>> s1 & s2

{2, 3}

>>> s1 | s2

{1, 2, 3, 4}

set 和 dict 的唯一区别仅在于没有存储对应的 value ,但是 set 的原理和 dict 一样,所以同样不可以放入不可变对象。

3.dict&set的区别与联系

python中字典和集合,无论是键还是值,都可以是混合类型

字典访问可以直接使用索引键,如果不存在,即会抛异常。

d1['name'] ——>'jason'

也可以使用get(key,default)函数来进行索引。如果键不存在,调用get() 函数可以返回一个默认值。

d = {'name':'jack'}

d.get('name','123') ——>'jack'

d.get('age','123') ——>'123'

集合不支持索引操作,因为集合本质上是一个哈希表。

想要判断一个元素在不在字典或集合内,可以用 value in dict/set 来判断。

除了创建和访问,字典和集合也支持增加、删除、更新等操作。

s = {1,2,3}

s.add(4)

s ——>{1,2,3,4}

s.remove(4)

s ——>{1,2,3}

集合的 pop() 操作是删除集合中的最后一个元素,但是集合本身是无序的,无法知道会删除哪个元素,因此这个操作得谨慎使用。

对字典或集合进行排序,比如,取出值最大的50对。

对于字典,通常会根据键或值,进行升序或降序排序

d = {'a':2,'b':1,'c':10}

d_sorted_by_key = sorted(d.items(), key=lambda x:x[0])

d_sorted_by_value = sorted(d.items(), key=lambda x:x[1])

d_sorted_by_key ——>[('a':2,'b':1,'c':10)]

d_sorted_by_value ——>[('b':1,'a':2,'c':10)]

这里返回的是一个列表,列表中的每个元素,是由原字典的键和值组成的元组。

而对于集合,其排序和列表、元组很类似,直接调用 sorted(set) 即可,结果会返回一个排好序的列表。

s = {4,3,2,1}

sorted(s) ——>[1,2,3,4]

4.不可变对象

关于不可变对象

str是不变对象,而list是可变对象

对于可变对象

>>> a = ['c', 'b', 'a']

>>> a.sort()

>>> a

['a', 'b', 'c']

对于不可变对象

>>> a = 'abc'

>>> a.replace('a', 'A')

'Abc'

>>> a

'abc'

对于不变对象来说,调用对象自身的任意方法,也不会改变对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

5.性能

字典和集合性能

比如电商企业的后台,存储了每件产品的ID、名称和价格。

(1)给定某件商品的ID,找出其价格

假设列表有 n 个元素,而查找的过程要遍历列表,那么时间复杂度就为 O(n)。即使先对列表进行排序,然后使用二分查找,也会需要 O(logn) 的时间复杂度(列表排序还需要 O(nlogn) )的时间。

但如果用字典来存储这些数据,那么查找就会非常便捷高效,只需要 O(1) 的时间复杂度,因为字典的内部组成是一张哈希表,可以直接通过键的值,找到其对应的值。

(2)找出这些商品有多少种不同的价格

如果选择使用列表,则在最差的情况下,需要 O(n^2) 的时间复杂度。

如果选择集合,由于集合是高度优化的哈希表,里面元素不能重复,并且其添加和查找操作只需 O(1) 的复杂度,那么总的时间复杂度就只有 O(n)。

6.工作原理

字典和集合工作原理

字典和集合内部结构都是一张哈希表。

对于字典:这张表存储了哈希值(hash)、键和值这3个元素

对于集合:区别就是哈希表内没有键和值的配对,只有单一的元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值