文档章节

Python复习笔记之“字典”

程序媛syuu
 程序媛syuu
发布于 2016/08/11 22:23
字数 2229
阅读 9
收藏 0

                我们已经了解到,列表这种数据结构适合于将值组织到一个结构中,并且通过编号对其进行引用。在本章中,你将学到一种通过名字来引用值的数据结构。这种类型的数据结构称为映射(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方法将字典所有的项以列表的方式返回,列表中的每一项都表示为(键,值)对的形式。但是项在返回时并没有遵循特定的次序。

 

 

           

© 著作权归作者所有

共有 人打赏支持
程序媛syuu
粉丝 4
博文 7
码字总数 8440
作品 0
海淀
python序列化数据本地存放

深入# 序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重 用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的...

临峰不畏
2015/01/18
0
0
我们可以在同一个虚拟机中运行 Python 2 和 3 代码而不需要更改代码吗?

从理论上来说,可以。Zed Shaw 说过一句著名的话,如果不行,那么 Python 3 一定不是图灵完备的。但在实践中,这是不现实的,我将通过给你们举几个例子来说明原因。 对于字典(dict)来说,这...

作者: Łukasz Langa
05/08
0
0
如何用 Python 可视化《三国》人物与兵器出现频率?(视频教程)

咱们以《三国演义》人名和兵器谱为例,尝试读取不同结构的文本文件,并且对其中的信息进行统计分析和可视化。 入门 如何帮助学生高效入门 Python ,一直是困扰我的问题。 总结经验后,我写下...

王树义
06/03
0
0
程序员必备,快速学习 Python 的全套14张思维导图(附高清版下载)

后台回复关键词 思维导图 可获取本文中的高清思维导图(PDF版) ML & AI∣一个有用的公众号 长按,识别二维码,加关注 获取更多精彩文章

micf435p6d221ssdld2
05/23
0
0
学习笔记(10月23日) --(列表、元组、字典)

二周一次课(10月23日) 一、学习python 列表的常用方法 列表是由一序列特定顺序排列的元素组成的。可以把字符串,数字,字典等任何东西加入到列表中,其中的元素之间没有任何关系。列表也是...

wanyang_wanyang
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高三暑假我是怎么想开去学linux系统的

高三的时候,我有一句口头禅:“老了老了,现在做题越来越迟钝了”。当时整天日夜苦读,体重日益增加,脸色越来越黯淡,我在终于熬过了高考的时候,简直心里面乐得开了花。我终于可以去做自己...

linuxprobe16
17分钟前
0
0
Python 获得命令行参数的方法

需要模块:sys 参数个数:len(sys.argv) 脚本名: sys.argv[0] 参数1: sys.argv[1] 参数2: sys.argv[2]

编程老陆
24分钟前
0
0
链队

队列用链表来表示时,需要用两个变量来记录队列两端的变化:theFront,theBack. 根据链接方向的不同,链队有两种链接方式(其实就是链表的头插入节点和尾插入节点,头删除节点和尾删除节点)。...

Frost729
28分钟前
0
0
IDEA toString() json模板

public java.lang.String toString() {java.lang.StringBuilder builder = new java.lang.StringBuilder();#set ($i = 0)#foreach ($member in $members)#if ($i == 0)builder.appen......

Mtok
37分钟前
0
0
Dubbo内核实现之SPI简单介绍

Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLo...

明理萝
42分钟前
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部