来源:Python数据之道 作者:阳哥 大家好,我是阳哥。 字典(dict)是python中的基础数据类型之一,字典的设计并不复杂,我们经常会用到这种数据类型。 同时,字典也有一些比较实用的情景。 学习任何一种编程语言,基础数据类型都是必备的底层基础,今天,我们来学习下Python中字典的使用。 主要内容包括:字典的基本用法字典推导式嵌套字典01、基本用法 在Python中,字典是一种可以将相关的两个信息关联起来的操作,并且字典可存储的信息量几乎不受限制。 字典是Python提供的一种常用的数据结构,它用于存放具有映射关系的数据。为了保存具有映射关系的数据,Python提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为key;另一组数据可通过key来访问,被称为value。 创建字典 字典是以key、value的形式创建的。 字典的每个键值keyvalue对用冒号:分割,每个键值对之间用逗号,分割,整个字典包括在花括号{}中,格式如下所示: d{key1:value1,key2:value2} 一般情况下,字典的创建可以有以下几种方式:创建一个空的字典mydict1{}创建key值为整数的字典mydict2{1:apple,2:ball}创建key值为string的字典mydict3{name1:apple,name2:ball}创建key值为数字和string混合的字典mydict4{name:apple,1:〔2,4,3〕}用dict()函数创建字典mydict5dict({1:apple,2:ball})以元组的形式组成序列创建字典mydict6dict(〔(1,apple),(2,ball)〕)print(mydict1:,mydict1)print(mydict2:,mydict2)print(mydict3:,mydict3)print(mydict4:,mydict4)print(mydict5:,mydict5)print(mydict6:,mydict6) 结果如下:mydict1:{}mydict2:{1:apple,2:ball}mydict3:{name1:apple,name2:ball}mydict4:{name:apple,1:〔2,4,3〕}mydict5:{1:apple,2:ball}mydict6:{1:apple,2:ball} 也可以通过下面的方式来创建空白字典创建空白字典的另一种方式mydict7dict()print(mydict7:,mydict7)mydict7 结果如下:{} 获取字典中的元素 通过key来获取value 获取字典中的元素,可以直接通过key值来获取对应的value,如下:mydict8{name:John,age:25,1:〔2,4,3〕}print(mydict8〔name〕)print(mydict8。get(name)) 结果如下:JohnJohn 请注意,如果字典的key值中没有该元素,则不能获取相应的value,这种情况下产生错误。print(mydict8〔name1〕) 结果如下:KeyErrorTraceback(mostrecentcalllast)ipythoninput4eedb02e2ace8inmodule1print(mydict8〔name1〕)KeyError:name1 通过value来获取key 通过value来获取key值,在Python中并没有提供直接的方法,我们可以通过自定义函数来实现,如下:defgetkeys(d,value):return〔kfork,vind。items()ifvvalue〕 函数中,d是字典。 在字典中修改或添加元素 在字典中,可以修改已有key对应的value值,或者添加新的keyvalue键值对数据,如下:mydict8{name:John,age:25,1:〔2,4,3〕}修改已有key对应的value的值mydict8〔age〕98添加新的keyvalue数据组mydict8〔gender〕manmydict8 结果如下:{name:John,age:98,1:〔2,4,3〕,gender:man} 从字典中删除元素 从字典中删除元素,或者删除整个字典,有以下一些方式。 pop()方法 移除字典数据pop()方法的作用是:删除指定给定键所对应的值,返回这个值并从字典中把它移除。使用pop()方法来删除mydict8{name:John,age:25,1:〔2,4,3〕}mydict8。pop(age)mydict8 结果如下:{name:John,1:〔2,4,3〕} del方法使用del方法来删除mydict8{name:John,age:25,1:〔2,4,3〕}delmydict8〔name〕mydict8 结果如下:{age:25,1:〔2,4,3〕} popitem()方法使用popitem()方法来删除mydict8{name:John,age:25,1:〔2,4,3〕,gender:man,school:UCI,city:NewYork}mydict8。popitem()mydict8 结果如下:{name:John,age:25,1:〔2,4,3〕,gender:man,school:UCI} 关于popitem()方法: 在Python3。5版本以及之前的时候,使用popitem()可能是随机删除的,但我曾经用的Python3。6版本,好像不是随机删除的,是删除的最后一项。 从Python3。7版本开始,使用popitem()方法是删除最后一项,因为字典默认是记住了顺序的:Ordereddictionariesarejustlikeregulardictionariesbuthavesomeextracapabilitiesrelatingtoorderingoperations。 Theyhavebecomelessimportantnowthatthebuiltindictclassgainedtheabilitytorememberinsertionorder(thisnewbehaviorbecameguaranteedinPython3。7)。 另外,我查阅了一下Python3。7版本中的描述,如下:popitem() Removeandreturna(key,value)pairfromthedictionary。PairsarereturnedinLIFOorder。 popitem()isusefultodestructivelyiterateoveradictionary,asoftenusedinsetalgorithms。Ifthedictionaryisempty,callingpopitem()raisesaKeyError。 Changedinversion3。7:LIFOorderisnowguaranteed。Inpriorversions,popitem()wouldreturnanarbitrarykeyvaluepair。 https:docs。python。org3librarystdtypes。htmlmappingtypesdict 在Python3。7版本中,是按照LIFO的原则进行删除的,是有序进行删除的。 LIFO(Lastin,firstout)即后进来的先删除(也可理解为按后面往前的排序进行删除) clear()方法 clear()方法是用来清除字典中的所有数据,因为是原地操作,所以返回None(也可以理解为没有返回值)使用clear()方法来清空字典中的所有数据,返回的是一个空字典mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}mydict8。clear()mydict8 结果如下:{} del方法 del方法可以删除字典中指定key值的内容。 另外,del可以删除整个字典,与clear()方法的清空字典中所有数据是不一样的。演示如下: 使用del方法是删除字典中指定key值对应的内容使用del方法是删除字典中指定key值对应的内容mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}delmydict8〔age〕mydict8 结果如下:{name:John,1:〔2,4,3〕,gender:man} 使用del方法是删除整个字典,删除后,再运行程序,会报错误使用del方法是删除整个字典,删除后,再运行程序,会报错误mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}delmydict8mydict8 结果如下:NameErrorTraceback(mostrecentcalllast)ipythoninput113d2a02242727inmodule4delmydict856mydict8NameError:namemydict8isnotdefined 字典内置函数方法 Python字典包含了以下内置函数: 序号函数及描述len(dict)计算字典元素个数,即键的总数。str(dict)输出字典可打印的字符串表示。type(variable)返回输入的变量类型,如果变量是字典就返回字典类型。 len(),str(),type()函数mydict6dict(〔(1,apple),(2,ball)〕)mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}print(len(mydict8))print(str(mydict6))print(type(mydict8)) 结果如下:4{1:apple,2:ball}classdict Python字典包含以下一些方法: 函数函数描述clear()删除字典内所有元素,返回空字典copy()返回一个字典的浅复制fromkeys(seq〔,val〕)创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值get(key,defaultNone)返回指定键的值,如果值不在字典中返回default值items()以列表返回可遍历的(键,值)元组数组keys()以列表返回一个字典所有的键setdefault(key,defaultNone)和get()类似,但如果键不存在于字典中,将会添加键并将值设为defaultupdate(dict2)把字典dict2的键值对更新到dict里values()以列表返回字典中的所有值pop(key〔,default〕)删除字典给定键key所对应的值,返回值为被删除的值。 key值必须给出。否则,返回default值。popitem()随机返回并删除字典中的一对键和值。 Python3。6及以后版本,以LIFO的原则进行删除的,是有序进行删除的。 clear(),get(),pop(),popitem()等在上面已介绍的方法,这里不做重复,仅演示其他方法的使用。 copy,keys,values,items方法mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}print(copy:,mydict8。copy())print(keys:,mydict8。keys())print(values:,mydict8。values())print(items:,mydict8。items()) 结果如下:copy:{name:John,age:25,1:〔2,4,3〕,gender:man}keys:dictkeys(〔name,age,1,gender〕)values:dictvalues(〔John,25,〔2,4,3〕,man〕)items:dictitems(〔(name,John),(age,25),(1,〔2,4,3〕),(gender,man)〕) update方法 通过update方法,可以更新字典的数据内容:mydict6{name:Lemon,age:25,1:〔2,4,3〕,gender:man}mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}mydict8。update(mydict6)mydict8 结果如下:{name:Lemon,age:25,1:〔2,4,3〕,gender:man} fromkeys方法 fromkeys()方法的演示如下: 请注意,该结果与zip()方法之后的结果是不一样的。seq〔name,age,city〕value〔Lemon,18,cs〕mydict9dict。fromkeys(seq,value)mydict9 结果如下:{name:〔Lemon,18,cs〕,age:〔Lemon,18,cs〕,city:〔Lemon,18,cs〕} zip()方法seq〔name,age,city〕value〔Lemon,18,cs〕mydict10dict(zip(seq,value))mydict10 结果如下:{name:Lemon,age:18,city:cs} setdefault方法 dict。setdefault(key,defaultNone) 该方法接收两个参数,第一个参数是健的名称,第二个参数是默认值。 假如字典中不存在给定的键,则把默认值赋值给对应的value,并返回默认值; 反之,不修改value,只返回value。mydict8{name:John,age:25,1:〔2,4,3〕,gender:man}print(字典中存在的key,返回对应value:,mydict8。setdefault(age,0))print(字典中不存在的key,返回默认值:,mydict8。setdefault(age1,0)) 结果如下:字典中存在的key,返回对应value:25字典中不存在的key,返回默认值:0 此外,还可以用setdefault()方法统计一个列表里单词出现的次数:用setdefault()方法统计一个列表里单词出现的次数strings(Lemon,kitten,Lemon,Lemon,lemonzs,Lemon,Lemon,lemonzs)counts{}forkwinstrings:counts〔kw〕counts。setdefault(kw,0)1counts 结果如下:{Lemon:5,kitten:1,lemonzs:2}02、字典推导式(dictcomprehension) 字典推导式的一般表达式如下: {key:valuefor(key,value)initerable} 有些用法与列表推导式是类似的,可以参考下面的内容:Python数据类型List介绍(上)Python数据类型List介绍(下)列表推导式 用字典推导式的方法创建字典:mydict01{x:xxforxinrange(6)}mydict01 结果如下:{0:0,1:1,2:4,3:9,4:16,5:25} 通过两个list创建字典:keys〔name,age,city〕values〔Lemon,18,cs〕mydict02{k:vfor(k,v)inzip(keys,values)}mydict02 结果如下:{name:Lemon,age:18,city:cs} 在特定条件下,用字典推导式的方法创建字典:mydict03{x:xxforxinrange(10)ifx20}mydict03 结果如下:{0:0,2:4,4:16,6:36,8:64}03、嵌套型字典 什么是嵌套型的字典 字典是以key、value的形式创建的,而嵌套型的字典有一个特征,就是key对应的value值也可以是一个字典。最简洁的嵌套型字典如下:d{key1:{key3:value3},key2:{key4:value4}} 创建一个嵌套型字典nesteddict01{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:18,city:changsha}}nesteddict01 结果如下:{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:18,city:changsha}} 上述的嵌套型字典中,字典第一层的key分别是1和2,而他们对应的value值又是都是字典,里面的字典的key都是name,age和city,但对应的value不一样。 从嵌套型字典中获取元素 从嵌套型字典中获取元素,跟从list,以及数组中获取元素时有些类似的。 嵌套型字典用〔〕进行不同层级元素的获取。nesteddict01{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:18,city:changsha}}print(nesteddict01〔1〕〔name〕)print(nesteddict01〔2〕〔city〕) 结果如下:Lemonchangsha 修改嵌套型字典的元素(更改、增加或删除元素) 针对嵌套型字典,同样是可以更新、增加或删除元素的。 增加一个空的字典nesteddict01{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:18,city:changsha}}增加一个空的字典nesteddict01〔3〕{}nesteddict01 结果如下:{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:18,city:changsha},3:{}} 修改或增加新的元素修改元素内容nesteddict01〔2〕〔age〕26增加新的元素nesteddict01〔3〕〔name〕zwsnesteddict01 结果如下:{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:26,city:changsha},3:{name:zws}} 在嵌套型字典中直接添加一个字典在嵌套型字典中直接添加一个字典nesteddict01〔5〕{name:rx,age:3,city:ly}nesteddict01 结果如下:{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:26,city:changsha},3:{name:zws},5:{name:rx,age:3,city:ly}} 删除某个具体元素内容删除某个具体元素内容delnesteddict01〔5〕〔city〕nesteddict01 结果如下:{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:26,city:changsha},3:{name:zws},5:{name:rx,age:3}} 删除嵌套字典里面的某个字典删除嵌套字典里面的某个字典delnesteddict01〔5〕nesteddict01 结果如下:{1:{name:Lemon,age:18,city:cs},2:{name:Lemonzs,age:26,city:changsha},3:{name:zws}} 通过for循环来获取嵌套字典内的元素formainid,maininfoinnesteddict01。items():print(mainid:,mainid)forkeyinmaininfo:print(key:,maininfo〔key〕) 结果如下:mainid:1name:Lemonage:18city:csmainid:2name:Lemonzsage:26city:changshamainid:3name:zws 用pprint输出嵌套型字典 用pprint可以使字典显示层次更清晰,需要安装pprint,安装命令如下: pipinstallpprint 演示如下:需要安装pprintpipinstallpprintpprint可以使字典显示层次更清晰importpprintmenu{dinner:{chicken:good,beef:average,vegetarian:{tofu:good,salad:{caeser:bad,italian:average}},pork:bad}}pprint。pprint(menu) 结果如下:{dinner:{beef:average,chicken:good,pork:bad,vegetarian:{salad:{caeser:bad,italian:average},tofu:good}}} 嵌套型字典的一些用途 可能有些疑惑,字典嵌套这么多层,在哪些地方可以用呢? 这里分享一个用途。嵌套型字典,经常在机器学习中的决策树算法中涉及到。 比如下面的menu,是一个字典。它也可以用树的形式显示出来,这在决策树中会经常用到。menu{dinner:{chicken:good,beef:average,vegetarian:{tofu:good,salad:{caeser:bad,italian:average}},pork:bad}} 示例:fromsklearn。treeimportDecisionTreeClassifier,exportgraphvizfromsklearnimporttreefromsklearn。datasetsimportloadwinefromIPython。displayimportSVGfromgraphvizimportSourcefromIPython。displayimportdisplayloaddatasetdataloadwine()featurematrixXdata。datatargetvectorydata。targetclasslabelslabelsdata。featurenamesprintdatasetdescriptionprint(data。DESCR)estimatorDecisionTreeClassifier()estimator。fit(X,y)graphSource(tree。exportgraphviz(estimator,outfileNone,featurenameslabels,classnames〔0,1,2〕,filledTrue))display(SVG(graph。pipe(formatsvg))) 可视化效果如下: 04小结 以上就是python中关于字典使用的基础内容,在实践中,咱们还会大量应用到字典。相对来说,嵌套字典会比较复杂些。当我们熟练使用字典的基本方法时,还是可以应对这些问题的。 有时候,也会有一些比较独特的字典,比如keyvalue键值对中的value是pandas中的dataframe,其基础原理,一些常用的方法还是一样的。