本文介绍本系列教程最后一个数据结构——字典
python
在现实生活中,查英语字典的时候,咱们一般根据单词来查找意思。而python中的字典也是相似的,根据特定的 “键”(单词)来查找 “值”(意思)。git
下面以电话簿为例,咱们的电话簿记录的是电话号码。当要查找电话号码时,咱们根据人名来查找其电话号码,因此人名就是字典的键,电话号码就是字典的值。假设有下面这样的人名和电话号码的电话簿:数据结构
人名=>电话 Aganzo=>1230 Jack=>0221 Lee=>1354 Emilie=>2479
如今咱们来建立一个字典来表示这个电话簿:app
>>> phonebook={'Aganzo':'1230', 'Jack':'0221', 'Lee':'1354', 'Emilie':'2479'} >>> phonebook {'Aganzo': '1230', 'Jack': '0221', 'Lee': '1354', 'Emilie': '2479'} >>>
从上面能够看出,建立字典的基本格式为{ 键1:值1, 键2:值2, 键3:值3 ...}
。除了这种方法,咱们还能够经过dict函数传递关键字参数来建立字典,像下面这样:函数
>>> phonebook = dict(Aganzo='1230', Jack='0221', Lee='1354', Emilie='2479') # 关键字参数就是字典的键,参数值就是字典的值 >>> phonebook {'Aganzo': '1230', 'Jack': '0221', 'Lee': '1354', 'Emilie': '2479'} >>>
咱们经常使用第一种方式建立字典,第二种方式比较少用,并且第二种方式有一个缺点:由于关键字参数会变为字典的键,因此键必须符合参数的命名规则(字母或下划线_
开头,其后是数字、字母或下划线)。学习
补充:建立空字典有两种方法,一种是直接使用{}
;另外一种是调用dict函数时,参数留空,即dict()
;像键:值
这样的东西叫作字典的 “项”。.net
字典的基本操做有:增、删、改、查。code
先来讲“查”:咱们能够经过名字来查找电话簿中的电话号码,在字典中相似这样,经过“键”来查“值”,基本格式为字典[键]
:对象
>>> phonebook['Aganzo'] '1230' >>> phonebook['Jack'] '0221' >>> phonebook['Lily'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Lily' >>>
从上面的代码能够看出,咱们的“电话簿”中不存在Lily的电话号码,可知,当字典中不存在要查的元素时,python会提示报错。咱们能够在查以前确认字典中是否有对应的项,使用成员运算符in
:blog
>>> 'Lily' in phonebook # 不存在 False >>> 'Jack' in phonebook # 存在 True >>>
或者查看“电话簿”中全部人的电话号码:
>>> for key in phonebook: ... print('%s=>%s' % (key, phonebook[key])) ... Aganzo=>1230 Jack=>0221 Lee=>1354 Emilie=>2479 >>>
再来讲“改”:此时得知Lee更换了电话号码为112233,须要对电话簿进行更改,使用以下代码:
>>> phonebook['Lee'] = '112233' >>> phonebook {'Aganzo': '1230', 'Jack': '0221', 'Lee': '112233', 'Emilie': '2479'} >>>
再到“增”:假设新认识了一位朋友Zieg,获得了朋友的电话号码为123456,须要在“电话簿”中新增一项,和“改”操做同样,使用赋值运算符=
:
>>> phonebook['Zieg'] = '123456' >>> phonebook {'Aganzo': '1230', 'Jack': '0221', 'Lee': '112233', 'Emilie': '2479', 'Zieg': '123456'} >>>
最后说“删”:朋友Jack与你绝交了(世事无常╮(╯▽╰)╭
),你决定删除他的联系方式,此时你狠心地运行了下面的代码:
>>> del phonebook['Jack'] >>> phonebook {'Aganzo': '1230', 'Lee': '112233', 'Emilie': '2479', 'Zieg': '123456'} >>>
“电话簿”中再也没有了Jack的电话号码……
好了,一个简单的示例事后,相信你们能理解字典的使用方法了,让咱们来一个小小的总结:
建立字典的方法:
x = {键1:值1, 键2:值2, 键3:值3 ...}
x = dict(key1=value1, key2=value2, key3=value3 ...)
x = {}
或x = dict()
字典的基本操做:
x['abc'] = 123
(键'abc'不存在)del x['abc']
x['abc] += 1
、x['abc'] = 2
、x['abc'] *= 10
……(键'abc'存在)result = x['abc']
、print(x['abc'])
……(键'abc'存在)补充:字典的用法和列表相似,只不过列表索引元素的时候使用的是数字做键,而字典大多数时候使用字符串索引元素。
关于字典的键,还有一点是要说清楚的:前面咱们使用字典的时候都是使用了字符串类型的键,可我没有说字典的键只能是字符串!
实际上,字典的键能够是任意的不可变类型,如:字符串(最经常使用)、元组、浮点数、整数。
字典也是对象,和列表同样,字典也提供了一些实用的方法,下面是介绍
clear方法用于清空字典中的全部项:
>>> d = {'name':'feather', 'age':18} >>> d {'name': 'feather', 'age': 18} >>> d.clear() >>> d {} >>>
这个方法是原地的操做,意思就是操做对象是在字典自己,这和直接将变量赋值为空字典是不同的,从下面的例子能够看出:
>>> x = {'a':1} >>> y = x # y变量引用的字典和x变量引用的是同一个字典 >>> x = {} # 将x变量引用改成另外一个字典,这个字典是空字典 >>> x {} >>> y # y变量引用的字典没有被改变 {'a': 1} >>>
copy方法用于返回一个新字典,这个新字典和原来的字典拥有相同的项:
>>> x = {'name':'feather', 'blog':['https://blog.csdn.net/lonely_feather', 'https://featherl.gitee.io/']} >>> y = x.copy() >>> y['name'] = 'Lee' >>> y['blog'].append('https://www.cnblogs.com/featherl/') >>> x {'name': 'feather', 'blog': ['https://blog.csdn.net/lonely_feather', 'https://featherl.gitee.io/', 'https://www.cnblogs.com/featherl/']} >>> y {'name': 'Lee', 'blog': ['https://blog.csdn.net/lonely_feather', 'https://featherl.gitee.io/', 'https://www.cnblogs.com/featherl/']} >>>
能够看到,y字典是从x复制而来的,因此改变y字典的键为'name'的项的时候并不影响x字典,要注意的是,y['blog'].append('https://www.cnblogs.com/featherl/')
这句代码不属于修改y字典,这是修改y字典的键为'blog'的项引用的列表,而y字典和x字典的'blog'项引用的是同一个列表(由于y字典的项是从x字典中复制而来的),因此修改这个列表的时候,在x和y两个字典上均可以看到效果。
这种问题是由于copy方法是“浅复制”,copy方法仅仅把相同的值存储到了一个新的字典里,要想避免这种问题,须要使用“深复制”,可使用copy模块的deepcopy函数来实现:
>>> from copy import deepcopy >>> x = {'list':[1,2,3]} >>> y = deepcopy(x) >>> y['list'].append(4) >>> x {'list': [1, 2, 3]} >>> y {'list': [1, 2, 3, 4]} >>>
fromkeys方法用给定的键建立新字典,每一个键对应的默认值都为None:
>>> {}.fromkeys(['name']) {'name': None} >>> dict.fromkeys(['name', 'age']) {'name': None, 'age': None}
上面代码的第一个例子中,咱们建立了一个空字典,而后使用这个空字典的fromkeys方法建立了一个新字典,第二个例子中,咱们直接使用dict这个类(实际上dict不是函数,是一个“类”)的fromkeys方法建立新字典。
咱们还能够本身设置默认值:
>>> dict.fromkeys(['name', 'age'], '???') {'name': '???', 'age': '???'}
get方法使用给定的键访问字典中的项,不过,若是字典中不存在该项时,get方法返回默认值None,而不是报错:
>>> x = {'name':'Lee'} >>> x.get('age') >>> print(x.get('name')) Lee >>> print(x.get('age')) None
一样的,这个默认值也是能够本身设定的:
>>> x = {'name':'Lee'} >>> x.get('age', '???') '???'
update方法将一个新字典合并到当前字典,当存在相同的键,用新字典的值进行覆盖:
>>> x = {'name':'Lee'} >>> x = {'name':'Lee', 'blog':'https://featherl.gitee.io'} >>> y = {'name':'feather', 'age':18} >>> x.update(y) >>> x {'name': 'feather', 'blog': 'https://featherl.gitee.io', 'age': 18}
pop方法用来返回指定键的项,并将该项从字典中移除:
>>> x = {1:1, 2:2, 3:3} >>> x.pop(1) 1 >>> x {2: 2, 3: 3}
上面的例子同时也证实了字典的键不必定是字符串。
popitem方法随机挑选一个项返回,并删除这个项。字典不一样于列表,字典的项是没有顺序,不一样的机器或者不一样版本的python,其字典存储项的顺序多是不同的,故popitem方法具体处理哪一项是无法预测的。
使用举例以下:
>>> x = {1:1, 2:2, 3:3} >>> x.pop x.pop( x.popitem( >>> help(x.popitem) >>> x.popitem() (3, 3) >>> x.popitem() (2, 2) >>> x.popitem() (1, 1) >>> x.popitem() Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'popitem(): dictionary is empty'
当字典为空的时候,该方法抛出错误。
items方法返回字典的全部的项,每一个项为一个形式为(key, value)
的元组,返回的类型是一种相似列表的类型,可使用for
循环迭代,可是没有列表的方法,最好先使用list转换成列表:
>>> x = {'name':'Lee', 'age':18} >>> x.items() dict_items([('name', 'Lee'), ('age', 18)]) >>> list(x.items()) # 转换成列表 [('name', 'Lee'), ('age', 18)]
注意:在python2中此方法还有后面的keys、values方法返回的就是列表类型,不过咱们学的是python3,要注意区分。
相似items的方法还有:
到此为止,本系列教程的python数据结构已经介绍完了,在本系列教程只是介绍了python中如何使用经常使用数据结构,并无讲实现原理。而数据结构在计算机领域是不可或缺的,但愿对数据结构了解甚少的读者能够认真学习一下数据结构的相关知识。
等学习完文件操做后,咱们将用一个小项目实践一下(其实忽略文件操做,目前学到的知识仍是能够作不少东西的),敬请期待! ( ̄︶ ̄)↗