您的位置:首页 > 编程语言 > Python开发

python学习笔记(四)字典(dict)

2017-07-19 22:58 330 查看

创建 dict

方法 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 类型的数据中增加“键值对”,也可以说是增加数值。那么,增加了值之后,那个字典还是原来的吗?也就是也要同样探讨一下,字典是否能原地修改?(列表可以,所以列表是可变的;字符串和元组都不行,所以它们是不可变的。)

>>> ad = {}
>>> id(ad)
3072770636L
>>> ad["name"] = "qiwsir"
>>> ad
{'name': 'qiwsir'}
>>> id(ad)
3072770636L

实验表明,字典可以原地修改,即它是可变的。

方法 2:

利用元组在建构字典,方法如下:

>>> name = (["first","Google"],["second","Yahoo"])
>>> website = dict(name)
>>> website
{'second': 'Yahoo', 'first': 'Google'}

或者用这样的方法:

>>> ad = dict(name="qiwsir", age=42)
>>> ad
{'age': 42, 'name': 'qiwsir'}

方法 3:

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

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

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

需要提醒注意的是,在字典中的“键”,必须是不可变的数据类型;“值”可以是任意数据类型。

>>> dd = {(1,2):1}
>>> dd
{(1, 2): 1}
>>> dd = {[1,2]:1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

访问 dict 的值

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

映射,就好比“物体”和“影子”的关系,“形影相吊”,两者之间是映射关系。此外,映射也是一个严格数学概念:A 是非空集合,A 到 B 的映射是指:A 中每个元素都对应到 B 中的某个元素。

既然是映射,就可以通过字典的“键”找到相应的“值”。

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

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

本节开头那个城市和区号的关系,也可以用字典来存储和读取。

>>> city_code = {"suzhou":"0512", "tangshan":"0315", "beijing":"011", "shanghai":"012"}
>>> print city_code["suzhou"]
0512

既然 dict 是键值对的映射,就不用考虑所谓“排序”问题了,只要通过键就能找到值,至于这个键值对位置在哪里就不用考虑了。比如,刚才建立的 city_code

>>> city_code
{'suzhou': '0512', 'beijing': '011', 'shanghai': '012', 'tangshan': '0315'}

虽然这里显示的和刚刚赋值的时候顺序有别,但是不影响读取其中的值。

在 list 中,得到值是用索引的方法。那么在字典中有索引吗?当然没有,因为它没有顺序,哪里来的索引呢?所以,在字典中就不要什么索引和切片了。

dict 中的这类以键值对的映射方式存储数据,是一种非常高效的方法,比如要读取值得时候,如果用列表,Python 需要从头开始读,直到找到指定的那个索引值。但是,在 dict 中是通过“键”来得到值。要高效得多。正是这个特点,键值对这样的形式可以用来存储大规模的数据,因为检索快捷。规模越大越明显。所以,mongdb 这种非关系型数据库在大数据方面比较流行了。

基本操作

字典虽然跟列表有很大的区别,但是依然有不少类似的地方。它的基本操作:

len(d),返回字典(d)中的键值对的数量
d[key],返回字典(d)中的键(key)的值
d[key]=value,将值(value)赋给字典(d)中的键(key)
del d[key],删除字典(d)的键(key)项(将该键值对删除)
key in d,检查字典(d)中是否含有键为 key 的项
下面依次进行演示。

>>> city_code
{'suzhou': '0512', 'beijing': '011', 'shanghai': '012', 'tangshan': '0315'}
>>> len(city_code)
4

以 city_code 为操作对象,len(city_code)的值是 4,表明有四组键值对,也可以说是四项。

>>> city_code["nanjing"] = "025"
>>> city_code
{'suzhou': '0512', 'beijing': '011', 'shanghai': '012', 'tangshan': '0315', 'nanjing': '025'}

向其中增加一项

>>> city_code["beijing"] = "010"
>>> city_code
{'suzhou': '0512', 'beijing': '010', 'shanghai': '012', 'tangshan': '0315', 'nanjing': '025'}

突然发现北京的区号写错了。可以这样修改。这进一步说明字典是可变的。

>>> city_code["shanghai"]
'012'
>>> del city_code["shanghai"]

通过
city_code["shanghai"]
能够查看到该键(key)所对应的值(value),结果发现也错了。干脆删除,用 del,将那一项都删掉。

>>> city_code["shanghai"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'shanghai'
>>> "shanghai" in city_code
False

因为键是"shanghai"的那个键值对项已经删除了,随意不能找到,用
in
来看看,返回的是
False


>>> city_code
{'suzhou': '0512', 'beijing': '010', 'tangshan': '0315', 'nanjing': '025'}

真的删除了哦。没有了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: