跟老齐学Python之字典,你还记得吗?


Posted in Python onSeptember 20, 2014

字典,这个东西你现在还用吗?随着网络的发展,用的人越来越少了。不少人习惯于在网上搜索,不仅有web版,乃至于已经有手机版的各种字典了。我曾经用过一本小小的《新华字典》。

《新华字典》是中国第一部现代汉语字典。最早的名字叫《伍记小字典》,但未能编纂完成。自1953年,开始重编,其凡例完全采用《伍记小字典》。从1953年开始出版,经过反复修订,但是以1957年商务印书馆出版的《新华字典》作为第一版。原由新华辞书社编写,1956年并入中科院语言研究所(现中国社科院语言研究所)词典编辑室。新华字典由商务印书馆出版。历经几代上百名专家学者10余次大规模的修订,重印200多次。成为迄今为止世界出版史上最高发行量的字典。
这里讲到字典,不是为了叙旧。而是提醒看官想想我们如何使用字典:先查索引(不管是拼音还是偏旁查字),然后通过索引找到相应内容。

这种方法能够快捷的找到目标。

在python中,也有一种数据与此相近,不仅相近,这种数据的名称就叫做dictionary,翻译过来是字典,类似于前面的int/str/list,这种类型数据名称是:dict

依据管理,要知道如何建立dict和它有关属性方法。

因为已经有了此前的基础,所以,学这个就可以加快了。

前面曾经建议看官一个很好的学习探究方法,比如想了解str的有关属性方法,可以在交互模式下使用:

>>>help(str)

将得到所有的有关内容。

现在换一个,使用dir,也能得到相同的结果。只是简单一些罢了。请在交互模式下:

>>> dir(dict)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']

以__(双下划线)开头的先不管。看后面的。如果要想深入了解,可以这样:

>>> help(dict.values)

然后出现:
Help on method_descriptor:
values(...)

    D.values() -> list of D's values

(END)

也就是在这里显示出了values这个内置函数的使用方法。敲击键盘上的q键退回。

概述

python中的dict具有如下特点:

dict是可变的
dict可以存储任意数量的Python对象
dict可以存储任何python数据类型
dict以:key:value,即“键:值”对的形式存储数据,每个键是唯一的。
dict也被称为关联数组或哈希表。
以上诸条,如果还不是很理解,也没有关系,通过下面的学习,特别是通过各种实验,就能理解了。

创建dict

话说创建dict的方法可是远远多于前面的int/str/list,为什么会多呢?一般规律是复杂点的东西都会有多种渠道生成,这也是从安全便捷角度考虑吧。

方法1:

创建一个空的dict,这个空dict,可以在以后向里面加东西用。

>>> mydict = {}

>>> mydict

{}

创建有内容的dict。
>>> person = {"name":"qiwsir","site":"qiwsir.github.io","language":"python"}

>>> person

{'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}

"name":"qiwsir"就是一个键值对,前面的name叫做键(key),后面的qiwsir是前面的键所对应的值(value)。在一个dict中,键是唯一的,不能重复;值则是对应于键,值可以重复。键值之间用(:)英文的分号,每一对键值之间用英文的逗号(,)隔开。
>>> person['name2']="qiwsir"    #这是一种向dict中增加键值对的方法

>>> person

{'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}

如下,演示了从一个空的dict开始增加内容的过程:
>>> mydict = {}
>>> mydict
{}
>>> mydict["site"] = "qiwsir.github.io"
>>> mydict[1] = 80
>>> mydict[2] = "python"
>>> mydict["name"] = ["zhangsan","lisi","wangwu"]
>>> mydict
{1: 80, 2: 'python', 'site': 'qiwsir.github.io', 'name': ['zhangsan', 'lisi', 'wangwu']}

>>> mydict[1] = 90 #如果这样,则是修改这个键的值
>>> mydict
{1: 90, 2: 'python', 'site': 'qiwsir.github.io', 'name': ['zhangsan', 'lisi', 'wangwu']}

方法2:

>>> name = (["first","Google"],["second","Yahoo"])   #这是另外一种数据类型,称之为元组,后面会讲到
>>> website = dict(name)
>>> website
{'second': 'Yahoo', 'first': 'Google'}

方法3:

这个方法,跟上面的不同在于使用fromkeys

>>> website = {}.fromkeys(("third","forth"),"facebook")
>>> website
{'forth': 'facebook', 'third': 'facebook'}

需要提醒的是,这种方法是从新建立一个dict。

访问dict的值

因为dict是以键值对的形式存储数据的,所以,只要知道键,就能得到值。这本质上就是一种映射关系。

>>> person
{'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
>>> person['name']
'qiwsir'
>>> person['language']
'python'
>>> site = person['site']
>>> print site
qiwsir.github.io

如同前面所讲,通过键能够增加dict中的值,通过键能够改变dict中的值,通过键也能够访问dict中的值。

看官可以跟list对比一下。如果我们访问list中的元素,可以通过索引值得到(list[i]),如果是让机器来巡回访问,就可以用for语句。复习一下:

>>> person_list = ["qiwsir","Newton","Boolean"]  
>>> for name in person_list:
...   print name
... 
qiwsir
Newton
Boolean

那么,dict是不是也可以用for语句来循环访问呢?当然可以,来看例子:

>>> person
{'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
>>> for key in person:
...   print person[key]
... 
qiwsir
qiwsir
python
qiwsir.github.io

知识

什么是关联数组?以下解释来自维基百科

在计算机科学中,关联数组(英语:Associative Array),又称映射(Map)、字典(Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。一个关联数组中的有序对可以重复(如C++中的multimap)也可以不重复(如C++中的map)。
这种数据结构包含以下几种常见的操作:

1.向关联数组添加配对
2.从关联数组内删除配对
3.修改关联数组内的配对
4.根据已知的键寻找配对
字典问题是设计一种能够具备关联数组特性的数据结构。解决字典问题的常用方法,是利用散列表,但有些情况下,也可以直接使用有地址的数组,或二叉树,和其他结构。
许多程序设计语言内置基本的数据类型,提供对关联数组的支持。而Content-addressable memory则是硬件层面上实现对关联数组的支持。
什么是哈希表?关于哈希表的叙述比较多,这里仅仅截取了概念描述,更多的可以到维基百科上阅读。

散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

Python 相关文章推荐
Django Admin实现上传图片校验功能
Mar 06 Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 Python
numpy中矩阵合并的实例
Jun 15 Python
浅谈flask源码之请求过程
Jul 26 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
Vs Code中8个好用的python 扩展插件
Oct 12 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 Python
Python读写yaml文件
Mar 20 Python
跟老齐学Python之再深点,更懂list
Sep 20 #Python
跟老齐学Python之画圈还不简单吗?
Sep 20 #Python
跟老齐学Python之list和str比较
Sep 20 #Python
Python显示进度条的方法
Sep 20 #Python
python中对list去重的多种方法
Sep 18 #Python
Python中用Descriptor实现类级属性(Property)详解
Sep 18 #Python
Python中的闭包总结
Sep 18 #Python
You might like
PHP4中实现动态代理
2006/10/09 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python实现每次处理一个字符的三种方法
2014/10/09 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
小学教师个人先进事迹材料
2014/05/17 职场文书
班级课外活动总结
2014/07/09 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python