自学Python-基本数据结构(2)

字典(dirc)

提到字典,不由的让我想起《新华字典》,上小学的时候几乎人手一本,当我们查字典的时候,可以按照拼音、偏旁和笔画来找到对应的汉字,python中的字典也是一样的,我们可以通过字典的key值查到字典的value,key和value组合起来就叫键值对

1
2
mydic = {"name":"Carl","age":22,"address":"Chengdu"}
print mydic

上述的”name”就叫做key,”Carl”叫做value,组合起来的”name”:”Carl”就叫键值对


创建字典

方法一

创建一个空的字典

1
2
mydic = {}
print mydic

创建有内容的字典

1
2
mydic = {"name":"Carl","age":22,"address":"Chengdu"}
print mydic

方法二

利用元组构建

1
2
3
name = (["first","Google"],["second","Yahoo"])
website = dict(name)
print websit

或者是这样创建

1
2
websit = dict(first = "Google",second = "Yahoo")
print websit

方法三

此方法不同于上面,需要用到fromkeys

1
2
website = {}.fromkeys(("third","forth"),"facebook")
print website

注意:此方法将生成一个新的字典


简单的添加、删除、判断(=、del、in)

1
2
3
4
5
mydic["like"] = "music" #赋值/添加键值对
print mydic
del mydic["like"] #del 删除键值对
print mydic
print "\"like\" in mydic:\t" + str("like" in mydic)

注意:mydic[“like”] = “music” 如果key值存在则改变对应的value,如果不存在则添加此键值对到字典中

in 判断是否存在键值对,存在返回True,否则返回Flase


使用方法添加键值对(update)

1
2
mydic.update([("pet","dog")])
print mydic

update的参数可以是列表元组,也可以是一个字典


使用方法删除键值对(pop、popitem)

1
2
3
4
print mydic.pop("pet")
print mydic
print mydic.popitem()
print mydic

pop(key)删除键值对 如果key不存在则会报错,返回删除的value

popitem()不加参数,随机删除一个并将被删除的value返回,如果字典为空则报错


使用方法获取key对应的value

get

1
2
3
print mydic.get("like")
print mydic.get("dislike","English")
print mydic["like"]

get只有一个key的参数,如果这个key存在则返回对应的value,如果不存在返回None

get包含两个参数第一个是key,第二个是value,如果key存在返回对应的value,如果不存在则返回第二个参数

第三种数组形式的获取,如果不存在则报错

setdefault

1
2
3
4
5
print mydic.setdefault("like")
print mydic.setdefault("pet")
print mydic
print mydic.setdefault("joy","switch")
print mydic

setdefault单参数和get一样,key不存在返回None,但是setdefault会将key:None添加到原字典中

setdefault两个参数时,如果key不存在则返回对二个参数,同时将这对键值对添加到原字典中


使用方法判断key是否存在

has_key

1
2
print mydic.has_key("pet")
print mydic.has_key("dislike")

存在返回True,否则返回False


字典的复制

“=”和copy

1
2
3
4
5
6
7
print id(mydic)                 
yourdic = mydic
print yourdic
print id(yourdic)
herdic = mydic.copy()
print herdic
print id(herdic)

“=”是假复制,地址不变
“copy”是真复制,地址改变
注:id()是查看变量地址的方法

copy和deepcopy

copy() 是浅复制,只能复制基础数据类型(int,str等),对于复杂的复合类型(list,dict等)只是复制了它们的引用,具体看下面的例子:

1
2
3
4
5
6
7
8
9
mydic["like"] = ["c","c++","python","java"]    #list作为value
print id(mydic)
print mydic
hisdic = mydic.copy() #copy mydic
print id(hisdic)
print hisdic
hisdic["like"].remove("java") #delete a value of list
print mydic
print hisdic

可以看到改变了原字典,copy得到的字典也发生了变化

要完全拷贝的话需要用到 deepcopy,这个方法需要额外添加copy库:

1
2
3
4
5
6
7
import copy

deepcopydic = copy.deepcopy(mydic)
print deepcopydic
mydic["like"].insert(3,"java")
print mydic
print deepcopydic

清空字典的三种方式

1
2
3
4
5
6
deepcopydic.clear()
print deepcopydic
hisdic = {}
print hisdic
del mydic
print mydic

clear()将字典清空,内存还在占用内容为空
del 将内存释放
“= {}” 指向一个新的内容为空的字典的地址,之前的还在成为没人指向的垃圾,python有自动回收垃圾功能不用担心


自学Python-基本数据结构(2)
https://carl-5535.github.io/2020/11/09/自学python/自学Python-基本数据结构-2/
作者
Carl Chen
发布于
2020年11月9日
许可协议