[零基础学Python]字典,你还记得吗?

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

《新华字典》是中国第一部现代汉语字典。最先的名字叫《伍记小字典》,但未能编纂完成。自1953年,开始重编,其凡例彻底采用《伍记小字典》。从1953年开始出版,通过反复修订,可是以1957年商务印书馆出版的《新华字典》做为初版。起因新华辞书社编写,1956年并入中科院语言研究所(现中国社科院语言研究所)词典编辑室。新华字典由商务印书馆出版。历经几代上百名专家学者10余次大规模的修订,重印200屡次。成为迄今为止世界出版史上最高发行量的字典。git

这里讲到字典,不是为了叙旧。而是提醒看官想一想咱们如何使用字典:先查索引(不论是拼音仍是偏旁查字),而后经过索引找到相应内容。github

这种方法可以快捷的找到目标。web

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

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

由于已经有了此前的基础,因此,学这个就能够加快了。网络

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

>>>help(str)

将获得全部的有关内容。ssh

如今换一个,使用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)而直接访问在内存存储位置的数据结构。也就是说,它经过把键值经过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称作散列函数,存放记录的数组称作散列表。

相关文章
相关标签/搜索