前面我们基本讲完了python的一个重要知识:序列(列表,元组,字符串),这一更同样带来一个很重要的python知识点:字典!(我个人把他理解做c语言当中的结构体,但也有点不同。看完这篇你就知道这字典到底是个啥了)
关注公众号:“我用代码编织世界”有豪礼相赠。回复书籍有惊喜哦!
小芝士:需要将一些列值组合成数据结构并通过编号来访问各个值时,列表很有用。本章介绍一种可以通过名称来访问各个值的数据结构。这种数据结构称为映射。字典是python唯一的内置映射类型,其中的值不按顺序,而是存储在键下。键可能是数,也可能是字符串或者元组。键可能是数,也可能是字符串或者元组。
字典的名称指出了这种数据结构的用途,普通图书适合按从头到尾的顺序阅读,如果你愿意,你可以快速翻到任何一页,这有点像拍摄中的的列表字典,日常生活中的字典和python字典,旨在让你能够轻松找到特定的词(键)来获取它的定义(值)
下面是一个电话本和一些号码:
>>>names = ['Alice','Beth','Cecil','Dee','Eric']
>>>numbers = ['1234','1465','5689','8945','9874']
注意:光理论是不够的,在此送大家一套2020最新Python全栈实战视频教程,点击此处 进来获取 跟着练习下,希望大家一起进步哦!
创建这些列表之后,就可以像下面这样查找cecil的电话号码
>>>numbers[names.index('cecil')]
'5689'
这样可行,但是不太实用,实际上你希望能够像下面这个样子做:
>>>phonebool['cecil']
'3558'
如何达成这个目标呢?只要phonebook是个字典就行
字典由键以及对应的值组成,这种键值对叫做项,在前面的示例中,键为名字,值为电话号码,每个键与值之间都用冒号分隔,项之间用逗号分隔,整个字典放在一个花括号,空的字典,没有任何项目,用两个花括号表示,就像这样{}
可以使用函数dict从其他映射(其他字典)或键值对序列来创建字典
>>>items = [('names','Gumby'),('age',42)]
>>>d = dict(items)
>>>d
{'age':42,'name':'Gumby'}
>>>d['name']
'Gumby'
可以使用关键字实参来调用这个函数:
>>>d = dict(name = 'Gumby',age = 42)
>>>d
{'age':42,'name':'Gumby'}
尽管这可能是函数dict最常见用法,但也是可以使用一个映射实参来调用他,这将创建一个字典,其中包含指定映射中所有项。像函数list,tuple和str一样,如果调用这个函数时没有提供任何实参,将返回一个空字典。从映射创建字典时候,如果该映射也是字典,可以不使用函数dict,而是使用地点方法copy。
字典的基本行为在很多方面都和序列类似
方法clear删除所有的字典项,这个操作就地执行,因此,没有返回值
>>>d = {}
>>>d['name'] = 'Gumby'
>>>d['age'] = 42
>>>d
{'age' : 42,'name':'Gumby'}
>>>returned_value = d.clear()
>>>d
{}
>>>print(returned_value)
None
这为什么很有用呢?我们来看两个场景。下面是第一个场景:
>>>x = {}
>>>y = x
>>>x['key']=value
>>>y
{'key' : 'value'}
>>>x = {}
>>>y
{'key' : 'value'}
下面是第二种场景:
>>>x = {}
>>>y = x
>>>x['key']='value'
>>>y
{'key' : 'value'}
>>>x.clear()
>>>y
{}
在这两个场景中,x和y最初都指向同一个字典。在第一个场景中,我通过将一个空字典赋值x来清空他,这对y没有任何影响,他依然指向原来字典,这种可行,但要是删除原来字典的所有元素,必须使用clear。如果这样做,y将也是空的,如第二个场景所示.
4.2.3.2 copy
>>>x = {'username':'admin','machines':['foo','bar','baz']}
>>>y=x.copy()
>>>y['username'] = 'mlh'
>>>y['machines'].remove('bar')
>>>y
{'username':'mlh','machines':'baz'}
>>>x
{'username':'admin','machines':['foo','baz']}
使用深复制就能解决问题(from copy import deepcopy)
方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是none
>>>{}.fromkeys(['name','age'])
{'age':None,'name':None}
这个示例创建了一个空字典,在对其调用方法fromkeys来创建另一个字典,这显得有点多余。你可以不这样做,而是直接对dict调用方法fromkeys。
>>>dict.fromkeys(['name','age'])
{'age':None,'name':None}
如果你不喜欢使用默认值none,可以自定义
>>>dict.fromkeys(['name','age'],'(unknown)')
{'age':unknown,'name':unknown}
方法get为访问字典项提供了宽松环境。通常,如果你试图访问字典中没有的项目,将引发错误。
>>>d = {}
>>>print(d['name'])
报错
而使用get不会这样
>>>print(d.get('name'))
None
如你所见,使用get来访问不存在的键时,没有引发异常,而是返回none。你可以指定”默认“,这样将返回你指定的值而不是none。
>>>d.get('name','N/A')
'N/A'
如果字典中包含指定的键,get的作用将与普通字典查找相同。
>>>d['name'] = 'Eric'
>>>d.get('name')
'Eric'
方法items返回一个包含所有字典项的列表,其中每个元素都为(key,value)的形式。字典项在列表中顺序不确定
>>>d = {'title':'python web site', 'url':'http://www.python.org','spam':0}
>>>>d.items()
dict_items([('url','http://www.python.org'),('spam',0),('title','python web site')])
返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代。另外,你还可确定其长度以及对其执行成员资格审查。
>>>it = d.items()
>>>len(it)
3
>>>('sapm',0) in it
True
视图的一个优点是不复制,它们始终是底层字典的反映,即便你修改了底层字典也是如此
>>>d['spam'] = 1
>>>('spam',0) in it
False
>>>d['spam'] = 0
>>>('spam',0) in it
True
然而,如果你要将字典项复制到列表中可自己动手做。
>>>list(d.items())
[('spam',0),('title','python web site'),('url','http://www.python.org')]
方法keys返回一个字典视图,其中包含指定字典中的键
方法pop可用于获取与指定键相关联的值,并将该键值对从字典中删除
>>>d = {'x':1,'y':2}
>>>d.pop('x')
1
>>>d
{'y':2}
方法popitem类似于list.pop,但是list.pop弹出列表中最后一个元素,而popitem随机地弹出一个字典项,因为字典项顺序不确定,所有没有”最后“这个概念。
>>>d = {'url':'http://www.python.org','spam':0,'title':'python web site'}
>>>d.popitem()
('url','http://www.python.org')
>>>d
{'spam':0,'title':'python web site'}
虽然popitem类似于列表方法pop,但字典中没有与append相类似的方法。因为字典无序。
方法update使用字典中的项来更新另一个字典。
>>>d = {
... 'title':'python web site'
... 'url':'http://www.python.org'
... 'changed':
... }
>>>x = {'title':'python language website'}
>>>d.update(x)
>>>d
{'url':'http://www.python.org','changed':
'Mar 29 23:30:15 Met 2020','title':'python language website'}
方法values返回一个由字典中的值组成的列表视图。不同于方法keys,方法values返回的视图可能包含重复值
>>>d = {}
>>>d[1] = 1
>>>d[2] = 2
>>>d[3] = 3
>>>d[4] = 1
>>>d.values()
dict_values([1,2,3,1])
注意:光理论是不够的,在此送大家一套2020最新Python全栈实战视频教程,点击此处 进来获取 跟着练习下,希望大家一起进步哦!
本章介绍了如下内容:
听说你也要学python,看这儿就够了(四)Please vivst me!
听说你也要自学python,看这儿就够了(三)Please vivst me!
听说你也要自学python,看这儿就够了(二)Please vivst me!
听说你也要自学python,看这儿就够了(一)Please vivst me!
讲完基本的数据结构,大家对使用已经有了基本的认识,下一章我们返璞归真,下一更我们详细讲解基础“语句”(注意哦,这里是打引号的语句)
关注公众号:“我用代码编织世界”既有大礼相赠!
后台回复"python"更有好礼相送哦!(解锁更多电脑知识看这儿就够了)