我是靠谱客的博主 灵巧超短裙,最近开发中收集的这篇文章主要介绍python教材答案字典与集合_Python基础(五)-字典与集合,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

字典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基础(五)-字典与集合所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部