摘要:本文主要向大家介绍了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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号