查看原文
其他

字典常用操作小结

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:李钊颖

文字编辑:余术玲

技术总编:张   邯


在之前的推文中我们已经介绍过字典的定义和特点(《数据类型——Dict、Set与Frozenset简析》)。字典是一系列键值对的可修改的无序组合,通过一个大括号来定义,每个键都与一个值相对应,构成Key-Value键值对,可以通过访问键来得到相应的值,其中键是唯一的,值可以不唯一。今天的推文我们介绍下Python中字典的常用操作。


1.访问字典
由于字典没有索引值,因此我们不能通过索引来查找对应的值。通过在方括号内输入相应的键可以查找对应的值,若输入不存在的键,则会报错。
In [1]: dicta={'sam':3,'william':2,'ben':1}In [2]: dicta['ben']Out[2]: 1

也可以通过get方法来获取某个键对应的值,这个同dict[key]差不多,只是当查找的键不存在就默认返回None,返回值可以通过加入参数自由定义。

In [3]: print(dicta.get('naen')) #若访问字典中不存在的键,则返回NoneNoneIn [4]: print(dicta.get('naen',-1)) #设置不存在时的返回值为-1-1


2.修改字典
当字典创建好之后,我们可以修改字典中某个键的值,可直接输入键,在后面跟上要修改为的值。若字典中没有这个键值对时,则加入到字典中,创建为新的键值对。
当字典中有这个键值对时,修改对应的值:
In [5]: dicta['ben']=10In [6]: dictaOut[6]: {'sam': 3, 'william': 2, 'ben': 10} #可以看到键' ben '对应的值由1被修改为10
       当字典中没有这个键值对时,则创建新的键值对:
In [7]: dicta['naen']='girl' In [8]: dictaOut[8]: {'sam': 3, 'william': 2, 'ben': 10, 'naen': 'girl'} #创建为新的键值对
也可以使用dict.setdefault(k,v)方法,其中k指键,v是值。其作用是如果字典中包含有k键,则返回原字典中该键对应的值,而且不会修改原字典,否则将该键值对(k,v)添加到字典中,并且返回v:
In [9]: dicta.setdefault("age",3)Out[9]: 3 #这个键不存在,返回设置的值In [10]: dictaOut[10]: {'sam': 3, 'william': 2, 'ben': 10,'naen': 'girl', 'age': 3} #这个键值对并不存在,所以添加上In[11]: dicta.setdefault("age",4)Out[11]: 3 #这个键已经存在,所以返回原字典的值In [12]: dictaOut[12]: {'sam': 3, 'william': 2, 'ben': 10,'naen': 'girl', 'age': 3} #字典中仍然不变

 

3.删除字典元素
字典创建好之后,能删除单一的元素也能清空字典。这里有三种方法都可以删除字典中的元素,但这三个方法实现的功能不同。下面为大家举例介绍:
dict.pop(key[,default])删除并返回对应的指定键的值,没找到这个值就返回default:
In [13]: dicta={'sam':3,'william':2,'ben':1}In [14]: dicta.pop('ben') #这里我们删除键值对“'ben':1”Out[14]: 1 #返回对应值1。 In [15]: dictaOut[15]: {'sam': 3, 'william': 2} #键值对“'ben':1”被删除掉了
dict.popitem()表示从dict中随机删除一项并以元组的形式返回该项,但在删除时不能指定删除项,只能随机删除一项:
In [15]: dicta={'sam':3,'william':2,'ben':1}In [16]: dicta.popitem()Out[16]: ('ben', 1) #随机删除了最后一项,并以元组的形式返回了该项。

Dict.clear()表示删除Dict的所有项,即将字典清空:

In [17]: dicta.clear()In [18]: dictaOut[18]: {} # 返回了一个空字典


4.字典的拷贝
       通过dict2=dict1.copy()方法,可以将字典dict1的内容拷贝给dict2,但也只是内容的拷贝,dict1和dict2所指的内存空间是不同的:
In [19]: dicta={'sam':3,'william':2,'ben':1}In [20]: dictb=dicta.copy() #将字典dicta的内容拷贝给dictbIn [21]: dictbOut[21]: {'sam': 3, 'william': 2, 'ben': 1} #两个字典内容相同
我们可以查看字典在内存空间中存放的地址:
In [22]: id(dicta)Out[22]: 1630299596120In [23]: id(dictb)Out[23]: 1630300339944
       可以看到,虽然两个字典内容一样,但是在内存空间中存放的地址是不同的


5.字典的更新
       使用dict.update()更新字典时,如果与原字典键值对中的键重复但值不同,则会被更新,不存在的键值对会增加到被更新字典中:
In [24]: dic1= {'name':'ben','age':3,'hobby':'eat'}In [25]: dic2= {'name':'william','age':5,'sex':'boy'}In [26]: dic2.update(dic1) #将字典dic1中的键值对更新到字典dic2中 In [27]: dic1Out[27]: {'name': 'ben', 'age': 3, 'hobby':'eat'} #字典dic1元素没有变化 In [28]: dic2Out[28]: {'name': 'ben', 'age': 3, 'sex': 'boy','hobby': 'eat'}  #字典dic2中多了“'hobby': 'eat'”键值对
由结果可以看出,更新之后字典dic1中的键值对更新到字典dic2中,原来的dic1不变,就是将没有的那个键值对加到dic2中。


6. 用fromkeys构造字典
dict.fromkeys(seq,val=None)创建并返回一个新字典,以seq(序列)中的元素作为该字典的键,val作为该字典中所有键对应的初始值,如果不提供此值,则默认为None。 
In [29]: str1="lzy" #定义str1作为字典的键In [30]: dict3={} #定义一个空字典In [31]: dict3=dict3.fromkeys(str1,7) #以str1元素作为键,对应值都为7In [32]: dict3Out[32]: {'l': 7, 'y': 7, 'z': 7}


7.字典的返回值
       (1)关于字典的返回值,当指定选项不同,其返回的结果也不同。虽然返回的都是列表,但组成元素不同:当指定keys()时,返回字典中键的列表;当指定values()时,返回字典中值的列表;当指定items()时,返回字典中键值对的列表。
In [33]: dic1.keys()Out[33]: dict_keys(['name', 'age', 'hobby']) #返回的是列表,其元素是所有的键 In [34]: dic1.values()Out[34]: dict_values(['ben', 3, 'eat']) #返回的是列表,其元素是所有的值 In [35]: dic1.items()Out[35]: dict_items([('name', 'ben'), ('age', 3),('hobby', 'eat')]) #返回值是由键值对构成的元组的列表
(2)承接上面字典的返回值,字典在遍历时默认情况及指定key()遍历的是键;指定values()时,遍历的是值;指定items()时,遍历的是键值对:
In [36]: for i in dic1: #默认情况下遍历的是键       :     print(i)
输出结果为:
nameagehobby
在指定values时,遍历的是值:
In [37]: for i in dic1.values(): : print(i) # 遍历结果是字典的值
输出结果为:
ben3eat
在指定items时,遍历的是键值对:
In [38]: for k,v in dic1.items(): : print(k,v) # 遍历的是字典的键值对
输出结果为:
name benage 3hobby eat


下面一张图带你回顾梳理本文内容:


至此,字典的定义、特点以及常用方法就介绍完了,相信大家对字典也有了更深的理解。接下来我们会继续介绍其他数据类型的常用方法想要获得第一手Stata和Python的学习资讯,请持续关注爬虫俱乐部的微信公众号!


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

       XPath Helper助XPath爬虫一臂之力

查找变量?用“codebook”!
distinct命令用法一览
Stata数据分析技术应用培训
玩转Python之“手把手”教你爬数据(一)
玩转Python之“手把手”教你爬数据(二
labelsof和labelbook介绍
Statalist上的“火云邪神”
爬虫实战程序的函数封装
Zipfile(二)
利用collapse命令转化原始数据
Stata中的数值型
爬虫实战——聚募网股权众筹信息爬取
duplicates drop之前,我们要做什么?
类型内置函数-type() isinstance()
数据含义记不住?—— label“大神”来帮忙

Zipfile(一)

tabplot命令

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存