dict:
简介:
Python内置了字典:dict的支持,dict的全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
为什么要使用dict:
假如需要根据同学的名字查找对应的成绩,如果使用list实现,那么则需要两个list
names=['Michael','Bob','Tracy']
scores=[95,75,85]
给定一个名字,要查找对应的成绩,就先要在names中查找相应的位置,
再从scors取出对应的成绩,list越长,耗时越长。
如果用dict实现,只需要一个“名字-成绩”的对照表,直接根据名字查找成绩,无论这个表多大,查找速度都不会慢。
实例:
d={'Michae1':95,'Bob':'dfs','Tracy':85}
d['Bob']
'dfs'
格式:{'key1':value1,'key2':value2,'key3':value3} 注:目前推测这个value 的数据类型有很多种
原理:
对于给定的key值,dict在内部就可以直接计算出Bob对应的位置,也就是对应的value对应的内存地址,直接取出来,所以速度很快。
对于这种数据类型而言,在放进的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value
把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:
1.通过key值放入
d['Adam']=67
d
{'Michae1': 95, 'Bob': 'dfs', 'Tracy': 85, 'Adam': 67}
d['Adam']
67
2.对同一个key再次赋值的话,会把之前的value值覆盖
d['Adam']=60
d['Adam']
60
3.当访问相应key值时,key如果不存在的话,那么则会报错
d['s']
KeyError Traceback (most recent call last)
<ipython-input-10-59d6658a9261> in <module>()
----> 1 d['s']
KeyError: 's'
避免这种情况的出现有两种办法。
3.1 通过 in 判断 key 是否存在
'Adam' in d
True
3.2 通过dict提供的get方法,如果key不存在,那么返回None,或者自己指定的value:
d.get('Adam')
60
print(d.get('B')) #在命令行下 d.get('B') 不会有显示
None
print(d.get('B',-1))
-1
dict与list 的比较:
dict的特点:
1.查找速度快,不会随着key的增加而增加
2.需要占用大量的内存,内存浪费严重、
;ist的特点:
1.插入删除的实践随元素的增加而增加
2.占用空间小,内存浪费小
dict是用空间换时间。
牢记:
dict的key必须是不可变对象。
原因:dict根据key来计算value的存储位置,如果每次计算相同key得到的结果不同,那dict内部就完全混乱,通过这个key计算位置的算法称为Hash。
在Python中,字符串、整数等都是不可变的,因此,可以放心的作为key。而list 是可变的,就不能作为key:
key=[1,2,3]
d[key]="a list"
TypeError Traceback (most recent call last)
<ipython-input-21-44a38dbf38f6> in <module>()
----> 1 d[key]="a list"
TypeError: unhashable type: 'list'
set
1.简介
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
2.创建set
当创建一个set,,需要提供一个list作为输入集合:
s=set([1,2,3,'df'])
s
{1, 2, 3, 'df'}
注:2.1.这里传入的参数[1,2,3,df]是一个list,然而显示的[1,2,3,'df']只是表明这个set内部有1,2,3,'df',有这四个元素,显示的顺序也不表示这个set是有序的。
2.2.重复元素在set中自动过滤:
s=([1,2,3,4,1,2])
s
{1, 2, 3, 4}
3. 常用函数
3.1 add(key) #key 为要添加的值,可以重复添加,但不会有效
s=set([1,2,3,4])
s.add(5)
s
{1, 2, 3, 4, 5}
#重复添加
s.add(5)
s
{1, 2, 3, 4, 5}
# 使用add() 每次只能用一次
s.add(5,6)
TypeError Traceback (most recent call last)
<ipython-input-12-964836f1bade> in <module>()
----> 1 s.add(5,6)
TypeError: add() takes exactly one argument (2 given)
3.2 remove(key) 方法可以移除元素
s=set([1,2,3,4,5])
s.remove(5)
s
{1, 2, 3, 4}
# 同样的 每次只能移除一个值
4. set可以做数学意义上的交集、并集等操作.
3.1 使用& 来求交
s1=set([1,2,3,45,6])
s2=set([1,2,3,4,5,6])
s3=s1 & s2
s3
{1, 2, 3, 6}
3.2 使用| 来求交
s1 | s2
{1, 2, 3, 4, 5, 6, 45}
三.set 和 dict的联系和区别
set和dict的原理是相同的,所以同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set 内部
不会有重复元素。
set和dict相比只是 没有储存相对应的value值而已。