20201019-Python学习笔记8

dict :全称dictionary,在其他语言中也称为map,使用键 - 值 (key-value)存储,具有极快的查找速度。

示例:如果用list实现根据学生名字查找对应成绩,需要两个list,先在名字list中找到,然后再查找对应成绩list,找到后取出成绩,这样花费的时间较长。

用dict实现,只需要一个“名字-成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。

>>> d = {'maike':99,'bob':70,'mali':68}
>>> d['maike']
99
>>> d['mali']
68
>>>

这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

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

>>> d = {'maike':99,'mali':68}
>>> d['maike']
99
>>> d['mali']
68
>>> d['mali'] = 100
>>> d['mali']
100
>>> d['maike'] = 80
>>> d['maike']
80
>>>

不存在key,会报错

>>> d['opo']
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
KeyError: 'opo'
>>>

两种判断方法:

1、通过in方式判断key是否存在

>>> 'zhangsan' in d
False
>>> 'mali' in d
True
>>> 'maike' in d
True
>>>

2、通过dict提供的get()方法,如果key不存在,返回none为空,或者自己指定的value

>>> d.get('mali')
100
>>> d.get('lisi')
>>> d.get('wangwu',-1)
-1
>>>

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

>>> d.pop('mali')
100
>>> d
{'maike': 80,'bob': 70}
>>>

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

两者对比特点

dict特点:

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

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

list特点:

查找和插入的时间随着元素的增多而增多

占用空间小,浪费内存少

dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

set:和dict类似,set是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

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

>>> s = set([1,2,3,4,5])
>>> s
{1,5}
>>>

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

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

>>> s = set([1,1,5,3])
>>> s
{1,5}
>>>

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

>>> s.add(3)
>>> s
{1,5}
>>> s.add(3)
>>> s
{1,5}
>>> s.add(7)
>>> s
{1,7}
>>>

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

>>> s.remove(4)
>>> s
{1,7}
>>> s.remove(5)
>>> s
{1,7}

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

>>> s1 = set ([1,3])
>>> s2 = set ([2,4])
>>> s1 & s2
{2,3}
>>> s1 | s2
{1,4}
>>>

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...