1+ > Now I appeal to you, brothers and sisters, by the name of our Lord Jesus Christ, that all of you be in agreement and that there be no divisions among you, but that you be united in the same mind and the same purpose. (1 CORINTHIANS 1:10)
2+
13#字典(1)
24
3- 字典,这个东西你现在还用吗?随着网络的发展,用的人越来越少了。不少人习惯于在网上搜索,不仅有web版,乃至于已经有手机版的各种字典了。我在上小学的时候曾经用过一本小小的《新华字典》,记得是拾了不少废品,然后换钱,最终花费了1.01元人民币买的。
5+ 字典,这个东西你现在还用吗?随着网络的发展,用的人越来越少了。不少人习惯于在网上搜索,不仅有web版,乃至于已经有手机版的各种字典了。
6+
7+ 我曾经上过小学,这是事实,那时候曾经用过一本小小的《新华字典》,与我差不多年龄的朋友,也都有同样的记忆,没记错的话应该是1.01元人民币一本。
48
59> 《新华字典》是中国第一部现代汉语字典。最早的名字叫《伍记小字典》,但未能编纂完成。自1953年,开始重编,其凡例完全采用《伍记小字典》。从1953年开始出版,经过反复修订,但是以1957年商务印书馆出版的《新华字典》作为第一版。原由新华辞书社编写,1956年并入中科院语言研究所(现中国社科院语言研究所)词典编辑室。新华字典由商务印书馆出版。历经几代上百名专家学者10余次大规模的修订,重印200多次。成为迄今为止世界出版史上最高发行量的字典。
610
7- 这里讲到字典,不是为了回忆青葱岁月。而是提醒看官想想我们如何使用字典 :先查索引(不管是拼音还是偏旁查字),然后通过索引找到相应内容。不用从头开始一页一页地找。
11+ 这里讲到字典,不是为了回忆青葱岁月。而是提醒读者想想曾经如何使用字典 :先查索引(不管是拼音还是偏旁查字),然后通过索引找到相应内容。不用从头开始一页一页地找。
812
913这种方法能够快捷的找到目标。
1014
11- 正是基于这种需要,python中有了一种叫做dictionary的数据类型 ,翻译过来就是“字典”,用dict表示。
15+ 正是基于这种需要,Python中有了一种叫做dictionary的对象(数据)类型 ,翻译过来就是“字典”,用dict表示。
1216
1317假设一种需要,要存储城市和电话区号,苏州的区号是0512,唐山的是0315,北京的是011,上海的是012。用前面已经学习过的知识,可以这么来做:
1418
2024 >>> print "{} : {}".format(citys[0], city_codes[0])
2125 suzhou : 0512
2226
23- > 请特别注意,我在city_codes中,表示区号的元素没有用整数型,而是使用了字符串类型,你知道为什么吗?
24- > 如果用整数,就是这样的。
27+ 请特别注意,我在city_codes中,表示区号的元素没有用整数型,而是使用了字符串类型,你知道为什么吗?
28+
29+ 如果用整数,就是这样的。
2530
2631 >>> suzhou_code = 0512
2732 >>> print suzhou_code
2833 330
2934
30- > 怎么会这样?原来在python中,如果按照上面那样做,0512并没有被认为是一个八进制的数,用print打印的时候,将它转换为了十进制输出。关于进制转换问题,看官可以网上搜索一下有关资料。此处不详述。一般是用几个内建函数实现:` int() ` , ` bin() ` , ` oct() ` , ` hex() `
35+ 怎么会这样?!读者能不能给出解答?
36+
37+ 这样来看,用两个列表分别来存储城市和区号,似乎能够解决问题。但是,这不是最好的选择,至少在Python里面。因为Python还提供了另外一种方案,那就是字典(dict)。
3138
32- 这样来看,用两个列表分别来存储城市和区号,似乎能够解决问题。但是,这不是最好的选择,至少在python里面。因为python还提供了另外一种方案,那就是字典(dict)。
39+ ##创建字典
3340
34- ##创建dict
41+ 创建字典,有多种方法,依次尝试。
3542
3643** 方法1:**
3744
38- 创建一个空的dict,这个空dict,可以在以后向里面加东西用 。
45+ 创建一个空的字典,然后可以向里面加东西 。
3946
4047 >>> mydict = {}
4148 >>> mydict
4249 {}
4350
4451不要小看“空”,“色即是空,空即是色”,在编程中,“空”是很重要。一般带“空”字的人都很有名,比如孙悟空,哦。好像他应该是猴、或者是神。举一个人的名字,带“空”字,你懂得。
4552
46- 创建有内容的dict 。
53+ 还可以创建不空的字典 。
4754
48- >>> person = {"name":"qiwsir","site":"qiwsir.github.io","language":"python"}
55+ >>> person = {"name":"qiwsir", "site":"qiwsir.github.io", "language":"python"}
4956 >>> person
5057 {'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
5158
52- ` "name":"qiwsir" ` ,有一个优雅的名字:键值对。前面的name叫做键(key),后面的qiwsir是前面的键所对应的值(value)。在一个dict中,键是唯一的,不能重复。值则是对应于键,值可以重复。键值之间用(:)英文的冒号,每一对键值之间用英文的逗号(,)隔开。
59+ ` "name":"qiwsir" ` ,有一个优雅的名字:键/值对。前面的` name ` 叫做键(key),后面的` qiwsir ` 是前面的键所对应的值(value)。
60+
61+ 在一个字典中,键是唯一的,不能重复。值则是对应于键,值可以重复。
62+
63+ 键值之间用(` : ` )英文的冒号,每一对键值之间用英文的逗号(` , ` )隔开。
64+
65+ 向已经建立的字典中,增加键值对的一种方法是这样的:
5366
54- >>> person['name2'] = "qiwsir" #这是一种向dict中增加键值对的方法
67+ >>> person['name2'] = "qiwsir"
5568 >>> person
5669 {'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
5770
58- 用这样的方法可以向一个dict类型的数据中增加 “键值对”,也可以说是增加数值。那么,增加了值之后,那个字典还是原来的吗?也就是也要同样探讨一下,字典是否能原地修改?(列表可以,所以列表是可变的;字符串和元组都不行,所以它们是不可变的。)
71+ 用这样的方法可以向一个字典类型的对象中增加 “键值对”,也可以说是增加数值。那么,增加了值之后,那个字典还是原来的吗?也就是也要同样探讨一下,字典是否能原地修改?(列表可以,所以列表是可变的;字符串和元组都不行,所以它们是不可变的。)
5972
6073 >>> ad = {}
6174 >>> id(ad)
7083
7184** 方法2:**
7285
73- 利用元组在建构字典 ,方法如下:
86+ 利用元组建构字典 ,方法如下:
7487
75- >>> name = (["first","Google"],["second","Yahoo"])
88+ >>> name = (["first", "Google"], ["second", "Yahoo"])
7689 >>> website = dict(name)
7790 >>> website
7891 {'second': 'Yahoo', 'first': 'Google'}
87100
88101这个方法,跟上面的不同在于使用fromkeys
89102
90- >>> website = {}.fromkeys(("third","forth"),"facebook")
103+ >>> website = {}.fromkeys(("third", "forth"), "facebook")
91104 >>> website
92105 {'forth': 'facebook', 'third': 'facebook'}
93106
94- 需要提醒的是,这种方法是重新建立一个dict。
95-
96107需要提醒注意的是,在字典中的“键”,必须是不可变的数据类型;“值”可以是任意数据类型。
97108
98109 >>> dd = {(1,2):1}
103114 File "<stdin>", line 1, in <module>
104115 TypeError: unhashable type: 'list'
105116
106- ##访问dict的值
117+ ##访问字典的值
107118
108- dict数据类型是以键值对的形式存储数据的 ,所以,只要知道键,就能得到值。这本质上就是一种映射关系。
119+ 字典对象是以键值对的形式存储数据的 ,所以,只要知道键,就能得到值。这本质上就是一种映射关系。
109120
110121> 映射,就好比“物体”和“影子”的关系,“形影相吊”,两者之间是映射关系。此外,映射也是一个严格数学概念:A是非空集合,A到B的映射是指:A中每个元素都对应到B中的某个元素。
111122
112123既然是映射,就可以通过字典的“键”找到相应的“值”。
113124
114- >>> person
115- {'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
125+ >>> person = {'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
116126 >>> person['name']
117127 'qiwsir'
118128 >>> person['language']
119129 'python'
120130
121- 如同前面所讲,通过“键”能够增加dict中的“值”,通过“键”能够改变dict中的“值”,通过“键”也能够访问dict中的“值”。
131+ 通过“键”能够读取到相应的“值”。在前面的操作中,也显示了,通过“键”能够增加字典中的“值”。
132+
133+ 还有,通过“键”能够改变字典中的“值”。
122134
123135本节开头那个城市和区号的关系,也可以用字典来存储和读取。
124136
125137 >>> city_code = {"suzhou":"0512", "tangshan":"0315", "beijing":"011", "shanghai":"012"}
126138 >>> print city_code["suzhou"]
127139 0512
128140
129- 既然dict是键值对的映射 ,就不用考虑所谓“排序”问题了,只要通过键就能找到值,至于这个键值对位置在哪里就不用考虑了。比如,刚才建立的city_code
141+ 既然字典是键值对的映射 ,就不用考虑所谓“排序”问题了,只要通过键就能找到值,至于这个键值对位置在哪里就不用考虑了。比如,刚才建立的city_code
130142
131143 >>> city_code
132144 {'suzhou': '0512', 'beijing': '011', 'shanghai': '012', 'tangshan': '0315'}
133145
134146虽然这里显示的和刚刚赋值的时候顺序有别,但是不影响读取其中的值。
135147
136- 在list中 ,得到值是用索引的方法。那么在字典中有索引吗?当然没有,因为它没有顺序,哪里来的索引呢?所以,在字典中就不要什么索引和切片了。
148+ 在列表中 ,得到值是用索引的方法。那么在字典中有索引吗?当然没有,因为它没有顺序,哪里来的索引呢?所以,在字典中就不要什么索引和切片了。
137149
138- > dict中的这类以键值对的映射方式存储数据 ,是一种非常高效的方法,比如要读取值得时候,如果用列表,python需要从头开始读 ,直到找到指定的那个索引值。但是,在dict中是通过 “键”来得到值。要高效得多。
150+ > 字典中的这类以键值对的映射方式存储数据 ,是一种非常高效的方法,比如要读取值得时候,如果用列表,Python需要从头开始读 ,直到找到指定的那个索引值。但是,在字典中是通过 “键”来得到值。要高效得多。
139151> 正是这个特点,键值对这样的形式可以用来存储大规模的数据,因为检索快捷。规模越大越明显。所以,mongdb这种非关系型数据库在大数据方面比较流行了。
140152
141153##基本操作
@@ -148,7 +160,7 @@ dict数据类型是以键值对的形式存储数据的,所以,只要知道
148160- del d[ key] ,删除字典(d)的键(key)项(将该键值对删除)
149161- key in d,检查字典(d)中是否含有键为key的项
150162
151- 下面依次进行演示 。
163+ 依次进行演示 。
152164
153165 >>> city_code
154166 {'suzhou': '0512', 'beijing': '011', 'shanghai': '012', 'tangshan': '0315'}
@@ -182,7 +194,7 @@ dict数据类型是以键值对的形式存储数据的,所以,只要知道
182194 >>> "shanghai" in city_code
183195 False
184196
185- 因为键是"shanghai"的那个键值对项已经删除了,随意不能找到,用` in ` 来看看,返回的是` False ` 。
197+ 因为键是` "shanghai" ` 的那个键值对项已经删除了,随意不能找到,用` in ` 来看看,返回的是` False ` 。
186198
187199 >>> city_code
188200 {'suzhou': '0512', 'beijing': '010', 'tangshan': '0315', 'nanjing': '025'}
@@ -191,7 +203,7 @@ dict数据类型是以键值对的形式存储数据的,所以,只要知道
191203
192204##字符串格式化输出
193205
194- 这是一个前面已经探讨过的话题,请参看[ 《字符串(4)》] ( ./109 ) ,这里再次提到,就是因为用字典也可以实现格式化字符串的目的。虽然在《字符串(4)》那节中已经有了简单演示,但是我还是愿意重复一下。
206+ 这是一个前面已经探讨过的话题,请参看[ 《字符串(4)》] ( ./109 ) ,这里再次提到,就是因为用字典也可以实现格式化字符串的目的。
195207
196208 >>> city_code = {"suzhou":"0512", "tangshan":"0315", "hangzhou":"0571"}
197209 >>> " Suzhou is a beautiful city, its area code is %(suzhou)s" % city_code
@@ -201,14 +213,16 @@ dict数据类型是以键值对的形式存储数据的,所以,只要知道
201213
202214其实,更酷还是下面的——模板
203215
204- 在做网页开发的时候,通常要用到模板,也就是你只需要写好HTML代码,然后将某些部位空出来,等着python后台提供相应的数据即可。当然,下面所演示的是玩具代码,基本没有什么使用价值,因为在真实的网站开发中,这样的姿势很少用上。但是,它绝非花拳绣腿,而是你能够明了其本质,至少了解到一种格式化方法的应用。
216+ 在做网页开发的时候,通常要用到模板,也就是你只需要写好HTML代码,然后将某些部位空出来,等着Python后台提供相应的数据即可。
217+
218+ 当然,下面所演示的是玩具代码,基本没有什么使用价值,因为在真实的网站开发中,这样的姿势很少用上。但是,它绝非花拳绣腿,而是你能够明了其本质,至少了解到一种格式化方法的应用。
205219
206220 >>> temp = "<html><head><title>%(lang)s<title><body><p>My name is %(name)s.</p></body></head></html>"
207221 >>> my = {"name":"qiwsir", "lang":"python"}
208222 >>> temp % my
209223 '<html><head><title>python<title><body><p>My name is qiwsir.</p></body></head></html>'
210224
211- temp就是所谓的模板,在双引号所包裹的实质上是一段HTML代码。然后在dict中写好一些数据 ,按照模板的要求在相应位置显示对应的数据。
225+ temp就是所谓的模板,在双引号所包裹的实质上是一段HTML代码。然后在字典中写好一些数据 ,按照模板的要求在相应位置显示对应的数据。
212226
213227是不是一个很有意思的屠龙之技?
214228
@@ -238,6 +252,8 @@ temp就是所谓的模板,在双引号所包裹的实质上是一段HTML代码
238252
239253> 散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
240254
255+ 以上对字典有了基本了解,后面要深入对字典的认识。
256+
241257------
242258
243259[ 总目录] ( ./index.md )   ;  ;  ; |  ;  ;  ; [ 上节:元组] ( ./115.md )   ;  ;  ; |  ;  ;  ; [ 下节:字典(2)] ( ./117.md )
0 commit comments