Python语言复习笔记之“字典”
小标 2018-07-17 来源 : 阅读 862 评论 0

摘要:本文主要向大家介绍了Python语言复习笔记之“字典”,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言复习笔记之“字典”,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

  我们已经了解到,列表这种数据结构适合于将值组织到一个结构中,并且通过编号对其进行引用。在本章中,你将学到一种通过名字来引用值的数据结构。这种类型的数据结构称为映射(mapping)。字典是Pyhton中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存在在一个特定的键(key)下。键可以是数字,字符串甚至是元组。

1.1字典的使用

                不管是现实中的字典还是Python中的字典,都是为了可以通过轻松查找某个特定的词语(键),从而找到它的定义(值)。

                某些情况下,字典比列表更加适用:

· 表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组。

· 存储文件修改时间,用文件名作为键。 

· 数字电话/地址薄。 *电话号码(以及其他可能以0开头的数字)应该表示为数字字符串,而不是整数

1.2创建和使用字典

                字典可以通过下面的方式创建。

>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}

                字典由多个键以及其对应的值构成的键-值对组成(我们也把键-值对称为项)。在上例中名字是键,电话号码是值。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来。空字典(不包括任何项)由两个大括号组成,像这样:{}。

                *字典中的键是唯一的(其他类型的映射也是如此),而值并不唯一。

1.2.1dict函数

                可以用dict函数,通过其他映射(比如其他字典)或者(键,值)对的序列建立字典。

                *dict函数根本不是真正的函数。它是个类型,就像list,tuple和str一样。

>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}>>> items=[('name','Gumby'),('age',42)]>>> d=dict(items)>>> d

{'age': 42, 'name': 'Gumby'}

                dict函数也可以通过关键字参数来创建字典 。

>>> d=dict(name='Gumby',age=42)>>> d

{'age': 42, 'name': 'Gumby'}

                还能以映射作为dict函数的参数,以建立其项与映射相同的字典(如果不带任何参数,则dict函数返回一个新的空字典,就像list,tuple以及str等函数一样)。

>>> d=dict(name='Gumby',age=42)>>> d

{'age': 42, 'name': 'Gumby'}>>> n=dict(d)>>> n

{'age': 42, 'name': 'Gumby'}>>> n=dict()>>> n

{}

 1.2.2基本字典操作  

             字典的基本行为在很多方面与序列(sequence)类似:

· len(d)返回d中项(键-值对)的数量;

· d[k]返回关联到键k上的值;

· d[k]=v将值v关联到键k上;(可用于更改值,也可用于添加项)

· del d[k]删除键为k的项;

· k in d检查d中是否含有键为k的项。

                尽管字典和列表有很多特性相同,但是也有下面一些重要的区别。

· 键类型 :字典的键不一定为整形数据(但也可以是),键可以是任意的不可变类型,比如浮点型(实型),字符串或者元组。*不包括list,因为list可变

· 自动添加: 即使键起初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索                  引上。

>>> x=[]>>> x[42]='Foobar'

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>IndexError: list assignment index out of range>>> x={}>>> x[42]='Foobar'>>> x

{42: 'Foobar'}

· 成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引。

                *Tips: 在字典中检查键的成员资格比在列表中检查值的成员资格更高效,数据结构的规模越大,两者的效率差距越明显。

                下面所示是电话本例子的代码:

#一个简单的数据库#字典人名作为键。每个人用另一个字典来表示,其键'phone'和'addr'分别表示他们的电话号码和地址。'和‘addr’分别表示他们的电话号码和地址。

people={

'Alice':{

'phone':'2341',

'addr':'Foo drive 23'

},

'Beth':{

'phone':'9102',

'addr':'Bar street 42'

},

'Cecil':{

'phone':'3158',

'addr':'Baz avenue 90'

}

}#针对电话号码和地址使用的描述性标签,会在打印输出的时候用到

labels={

'phone':'phone number',

'addr':'address'

}

name=input('Name:')

request=input("'Phone number(p)' or 'address(a)?'") #查找电话号码还是地址?#使用正确的键:if request=='p':

key='phone'if request=='a':

key='addr'#如果名字是字典中的有效键才打印信息if name in people:

print("%s's %s is %s." % (name,labels[key],people[name][key]))

1.2.3字典的格式化字符串

                在每个转换说明符中的%字符后面,可以加上键(用圆括号括起来),后面再跟上其他说明元素。

>>> phonebook

{'Cecil': '3258', 'Beth': '9102', 'Alice': '2341'}>>> "Ceil's phone number is %(Cecil)s." %phonebook"Ceil's phone number is 3258."

                当以这种方式使用字典的时候,只要所有给出的键都能在字典中找到,就可以使用任意数量的转换说明符。这类字符串格式化在模板系统中非常有用。

1.2.4字典方法

                就像其他内建类型一样,字典也有方法。

        1.clear

                clear方法清除字典中所有的项。这是个原地操作(list.sort),所以无返回值(或者说返回None)。

>>> 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

{'key': 'value'}>>> x={}>>> y

{'key': 'value'}

                然后是第二种情况:

>>> x={}>>> y=x>>> x['key']='value'>>> y

{'key': 'value'}>>> x.clear()>>> y

{}

                两种情况中,x和y最初对应同一个字典。情况1中,通过将x关联到一个新的空字典“清空”它,这对y一点影响也没有,它还关联到原先的字典。这可能是所需要的行为。但是如果真的想清空原始字典中的所有元素,必须使用clear方法。正如情况2中所看到的,y随后也被清空了。

        2.copy

                copy方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shallow copy),因为值本身就是相同的,而不是副本)

>>> x={'username':'admin','machines':['foo','bar','baz']}>>> y=x.copy()>>> y

{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}>>> y['username']='mlh'>>> y['machines'].remove('bar')>>> y

{'username': 'mlh', 'machines': ['foo', 'baz']}>>> x

{'username': 'admin', 'machines': ['foo', 'baz']}

                 可以看到,当在副本中替换值的时候,原始字典不受影响,但是,如果修改了某个值(原地修改而不是替换),原始的字典也会改变,因为同样的值也存储在原字典中(就像上面例子中的machines列表一样)。

                避免这个问题的一种方法就是使用深复制(deep copy),复制其包含的所有值。可以使用copy模块中的deepcopy函数来完成操作。

>>> from copy import deepcopy>>> d={}>>> d['name']=['Alfred','Bertrand']>>> d

{'name': ['Alfred', 'Bertrand']}>>> c=d.copy()>>> dc=deepcopy(d)>>> d['name'].append('Clive')  #append为在列表末尾追加新的对象>>> c

{'name': ['Alfred', 'Bertrand', 'Clive']}>>> dc

{'name': ['Alfred', 'Bertrand']}

        3.fromkeys

                fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None。

>>> {}.fromkeys(['name','age'])

{'age': None, 'name': None}

                刚才的例子中首先构造了一个空字典,然后调用它的fromkeys方法,建立另外一个字典——有些多余。

                此外,您还可以直接在dict上面调用该方法,dict是所有字典的类型。

                如果不想使用None作为默认值,也可以自己提供默认值。

>>> dict.fromkeys(['name','age'])

{'age': None, 'name': None}>>> dict.fromkeys(['name','age'],'(unknown)')  #自己提供默认值unknown

{'age': '(unknown)', 'name': '(unknown)'}

        4.get

                get方法是个更宽松的访问字典的方法。

                一般来说,如果试图访问字典中不存在的项时会出错:

>>> d={}>>> print(d['name'])

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>KeyError: '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'

        5.has_key

                has_key可以检查字典中是否含有特定的键。表达式d.has_key(k) 相当于表达式k in d。使用哪个方式很大程度上取决于自己的爱好。Python3.0中不包含这个函数。

        6.items和iteriterms

                items方法将字典所有的项以列表的方式返回,列表中的每一项都表示为(键,值)对的形式。但是项在返回时并没有遵循特定的次序。

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言Python频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程