概述
字典dict
python内置了字典dict,在其他语言中也成为map,使用键-值(key-value)存储,具有极快的查找速度。即:
d = {key1: value1, key2: valuue2, key3: value3, ...}
# 查找key1的值
d[key1]
若key值不存在,dict就会报错:
>>> d[key100] #假定上述d字典的...不到key100
Traceback (most recent call last):
File "", line 1, in
KeyError: 'Thomas'
为了避免key不存在错误,有两种方式:
通过in判断key是否存在
>>> key100 in d
False
通过get(key)方法,若key不存在,返回None,或者自己指定的value:
>>> d.get(key100) # 返回None的时候,Python的交互环境不显示结果
>>> d.get(key100, -1)
-1
删除一个key,使用pop(key)方法,对应的value也会从dict中删除
注意
dict内部存放的顺序和key放入的顺序是没有关系的。
dict和list的比较
比较
dict
1. 查找和插入的速度极快,不会随着key的增加而变慢;2.需要占用大量的内存,内存浪费多。
list
1.查找和插入的时间随着元素的增加而增加;2.占用空间小,浪费内存很少。
因此,dict是用空间来换取时间的一种方法。
正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象,故list不能作为key。
集合set
set和dict类似,是一组key的集合,但是不存储value,由于key不能重复,所以在set中,没有重复的key,即
s = set([key1, key2, key3, ...])
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意:传入的参数是一个list,而现实的{1, 2, 3}知识告诉你这个set内部有这3个元素,显示的顺序也不表示set是有序的。
若出现重复元素,在set中自动被过滤:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
可以通过add(key)添加元素到set中,remove(key)删除指定元素
# 添加元素
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
# 删除元素
>>> 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}
Tips:
tuple元组是不可变对象,当(1,2,3)和(1,[2,3])放入dict或set中时:
>>> obj = {(1, 2, 3): 1, (4, 5, 6): 2}
>>> obj[(1, 2, 3)]
1
>>> obj = {(1, [2, 3]): 1, (4, [5, 6]): 2}
Traceback (most recent call last):
File "", line 1, in
TypeError: unhashable type: 'list'
>>> obj = set([(1, 2, 3), (4, 5, 6)])
>>> obj
{(1, 2, 3), (4, 5, 6)}
>>> obj = set([(1, [2, 3]), (4, [5, 6])])
Traceback (most recent call last):
File "", line 1, in
TypeError: unhashable type: 'list'
如上所示,当使用元组当作dict或set的key时,可以正常使用,因为元组是个不可变对象。
当元组中的元素有list可变对象时,会报错,出现类型错误,类型list无法hash的错误。
分别讲解:
list为什么不能作为key值:
对于list的hash函数,有两种实现方法
基于id。"如果hash值不同,那么他们的id当然不同"。考虑到list一般作为容器,基于id来hash会导致即使他们的内容相同,字典依然将他们作为不同的元素对待。创建一个一摸一样的list用字典查找永远会得到一个KeyError
基于内容。tuple就是这样做的,注意一点,list是可以修改的,当list修改之后,就永远别想再从字典中拿回来了。即:
>>> l = [1, 2]
>>> d = {}
>>> d[l] = 42
>>> l.append(3)
>>> d[l]
# 原来的hash值是基于[1, 2]hash的
# 现在是基于[1, 2, 3],所以找不到
Traceback (mostrecentcalllast): File "", line 1, in ? KeyError: [1, 2, 3] >>> d[[1, 2]]
# 基于hash [1, 2]
# 但是遍历的时候找不到key相等的键值对
#(因为字典里的key变成了[1, 2, 3] Traceback (mostrecentcalllast): File "", line 1, in ? KeyError: [1, 2]
原因:
原来的hash值是基于[1, 2]hash的,但是遍历的时候找不到key相等的键值对,因为字典里的key变成了[1, 2, 3]。故内置的list不能作为字典的key,但tuple是不可变的,所以tuple可以作为字典的key。
元组中存在list元素时,不能作为key的原因
从上述可得,因为tuple时基于内容进行hash的,内容不可变,当list作为元组中的元素时,list时可变的,基于内容进行hash计算的时候,会因为改变了内容,从而会找不到key相对的键值对。
dict
函数
参数
用途
get()
key,[val]
根据key获取相应的value,或返回指定的val
pop()
key
删除一个key以及其对应的value
set
函数
参数
用途
add()
key
添加元素到set
remove()
key
删除元素
最后
以上就是灵巧超短裙为你收集整理的python教材答案字典与集合_Python基础(五)-字典与集合的全部内容,希望文章能够帮你解决python教材答案字典与集合_Python基础(五)-字典与集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复