在Python中有用中数据对象类型叫做字典
什么叫做字典呢,也可以当做是一种数据的集合,当我们需要查询我们不知道的数据的时候,它就会从这个字典中去查找。
我们使用过字典吧,无论是中文字典还是英文字典,字典开始都有一个以字母排序的目录,目录下可以快速引导我们去哪儿查自己需要的东西。那么Python中的字典也是如此。
首先我们看看一个示例:
需求描述
假如我们这儿有两个列表,一个列表存储城市名称,一个存储城市相应的区号,然后我们需要通过城市找到对应的区号。这个该怎么实现呢??
现在来看看具体实现代码
>>> city = ["Beijing","Shanghai","Lanzhou"]
>>> city_code = ["0931","010","020"]
>>> print "{0}:{2}".format(city[0],city_code[1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range ##这个报错提示元组索引越值
>>> print "{0}:{1}".format(city[0],city_code[1])
Beijing:010
>>>
附加
思考,为什么在city_code里面的列表我们采用的是字符串类型,而不是整型呢?
答案是Python中,数值型将会被当做是一个八进制数,然后将其转换为十进制输出其结果将会是,代码如下
>>> city
['Beijing', 'Shanghai', 'Lanzhou']
>>> city_code = ['0931',010,020]
>>> city_code
['0931', 8, 16] #发现有没有不一样
>>>
当然,以上的数值型我们可以使用内置函数来转换,如int( ) ,bin( ),oct( ),hex( )
不上代码的同学不是好学生
>>> int('1111',2) #将十进制1111转换为二进制
15
>>> int('a',16) #将a转换为十六进制
10
>>> int('1231',8) #将1231转换为八进制
665
>>> hex(17) #将十进制17转换为十六进制
'0x11'
>>> oct(13) #将十进制13转换为八进制
'015'
>>>
那么,对于城市对应区号的查询我们可以通过两个列表来实现,但是这不是最好的方法,Python提供了一种更加有效,快速的方式,那就是字典
方法一:1、如何创建一个字典
首先来看一个空字典
>>> nulldict = { }
>>> nulldict
{}
>>>
在Python中,不要小看“空”,“空”在编程中是非常重要的。
接下来我们创建一个不为空的字典
>>> test = {"domain":"https://www.baidu.com","name":"baidu","language":"zh_CN"}
>>> test
{'domain': 'https://www.baidu.com', 'name': 'baidu', 'language': 'zh_CN'}
>>>
我们可以看到,在字典中,我们可以根据键和值查找需要的信息。这在Python中有一个优雅的名字,叫做键值对,我为什么要说优雅呢?,对了,Python好像是一个花姑娘。
思考:既然是字典,那么有可能字典中的数值有误,我们有时候会根据需要对其进行修改,要么增加,要么修改,这样该怎么办呢??
2、给字典中增加值
>>> test = {"domain":"https://www.baidu.com","name":"baidu","language":"zh_CN"}
>>> test
{'domain': 'https://www.baidu.com', 'name': 'baidu', 'language': 'zh_CN'}
>>> test["domain2"]="https://www.baidu.com" #**给字典中增加键值对**
>>> test
{'domain2': 'https://www.baidu.com', 'domain': 'https://www.baidu.com', 'name': 'baidu', 'language': 'zh_CN'}
>>>
思考,增加了值之后,字典对象还是原来的内存地址吗?
我们知道,在Python中,列表可以进行原地修改,字符串和元组都是不行的,具体请看前面的博客。Python学习之列表List( )
>>> id(demo)
37799584
>>> demo["website"] = "https://www.baidu.com"
>>> demo
{'website': 'https://www.baidu.com'}
>>> id(demo)
37799584
>>>
通过上面的实验,我们发现,字典可以进行原地修改,因为它是可变的
方法二 2、通过元组创建字典
>>> url = ( ["first","Baidu"],["second","Google"])
>>> url
(['first', 'Baidu'], ['second', 'Google'])
>>> website = dict(url)
>>> website
{'second': 'Google', 'first': 'Baidu'}
>>>
或者使用
>>> school = dict(name = "CSDN_BLOG",website = "http://blog.csdn.net/")
>>> school
{'website': 'http://blog.csdn.net/', 'name': 'CSDN_BLOG'}
>>>
方法三 3、使用fromkeys
>>> url = {}.fromkeys(("Third","Forth"),"WWW.BAIDU.COM")
>>> url
{'Forth': 'WWW.BAIDU.COM', 'Third': 'WWW.BAIDU.COM'}
>>>
前方高能预警,字典中的“键”,必须是不可变的对象,“值”可以是任意类型
如下:
>>> test = {(1,2):1}
>>> test
{(1, 2): 1}
>>> test = {[1,2]:1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
如何访问字典中的值
字典类型的对象是以键值对的形式存储数据的,所以,只要知道键,就能知道值,本质上就是一种映射关系。
想必大多数学习编程的人都知道函数吧,就是函数中的映射
既然是映射,就可以通过相应的键得到相应的值
>>> test = {"domain":"https://www.baidu.com","name":"baidu","language":"zh_CN"}
>>> test
{'domain': 'https://www.baidu.com', 'name': 'baidu', 'language': 'zh_CN'}
>>> test["domain"]
'https://www.baidu.com'
>>> test['name']
'baidu'
>>>
字典中用”键值对”来实现数据的存储是一种非常高效的方法,比如要读取值得时候,如果使用列表的话,那么Python需要从头开始读取,直到找到指定的那个索引值。但是,在字典中,是通过“键”来寻找值,显然这种映射关系的效率要高的多。正式这个特点,现在的Nosql非常流行,比如NOsql的典型代表,redis,还有Mongdb这种非关系型数据库在大数据方面非常流行。
今天的学习就到这里,明天更新字典中的基本操作
思考,那么在开始中的城市区号自己是否可以创建一个字典来实现查找对应呢?