文档章节

Python复习笔记之“字典”

程序媛syuu
 程序媛syuu
发布于 2016/08/11 22:23
字数 2229
阅读 8
收藏 0
点赞 0
评论 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 2 和 3 代码而不需要更改代码吗?

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

作者: Łukasz Langa ⋅ 05/08 ⋅ 0

如何用 Python 可视化《三国》人物与兵器出现频率?(视频教程)

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

王树义 ⋅ 06/03 ⋅ 0

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

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

micf435p6d221ssdld2 ⋅ 05/23 ⋅ 0

Python机器学习及实践学习笔记1

简介 机器学习综述 机器学习隶属于人工智能研究与应用的一个分支。 “图灵测试”(Turing Test),用来判断一台计算机是否达到具备人工智能的标准。 大概描述:“如果通过问答这种方式,我们已...

zealfory ⋅ 05/28 ⋅ 0

7.python数据分析与展示------Pandas库入门

1.Pandas库的介绍 Pandas是Python第三方库,提供高性能易用数据类型和分析工具 import pandas as pd Pandas基于Numpy实现,常与Numpy和Matplotlib一同使用 import pandas as pd d =pd.Series...

bxg1065283526 ⋅ 04/29 ⋅ 0

Python Fire试用体验

之前用Python写过一些CLI的小工具,在CLI命令行传参处理上,一般都是用argparse,最近看到Google开源的Python Fire(2017-3-2就开源了), 把argparse包装了,可以自动将代码转变成 CLI,开发...

ahlfors ⋅ 05/24 ⋅ 0

Python基础——装饰器、模块(0417)

一、Python基础——复习 1、字符串的常用操作 2、列表的常用操作 3、字典的常用操作 二、Python——装饰器:函数可以是变量 1、Python是一种面向对象的编程语言,在Python中所有的都可以是Pyt...

python初雪之路 ⋅ 04/17 ⋅ 0

Python的22个编程技巧,简化 if 语句、开启文件分享

小编给大家推荐一个学习氛围超好的地方,python交流企鹅裙:474534951!适合在校大学生,小白,想转行,想通过这个找工作的加入 。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直...

诸葛玥 ⋅ 04/15 ⋅ 0

Python刷题提升——第一季(题目篇)

博客写了一年多了,也积攒了100+文章分享 感谢大家陪我一起学习 每次在评论区看到你们的疑问和鼓励,我甚是欣慰 在部分文章最后留有一些问题,大家都会踊跃给出自己的答案 除了之前的Python数...

ID王大伟 ⋅ 05/05 ⋅ 0

Python爬虫入门 | 3 爬虫必备Python知识

点击上方蓝色字体,关注我们 15 这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源。看着文章,打开电脑动手实践,平均45分钟就...

ch3ruf0termb3yh ⋅ 04/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 19分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 22分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 23分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 23分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 24分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 26分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 27分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 32分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 38分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 39分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部