一、字典介绍

字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

1、字典的主要属性

*通过键而不是偏移量来读取

字典有时称为关联数组或者哈希表。它们通过键将一系列值联系起来,这样就可以使用键从字典中取出一项。如果列表一样可以使用索引操作从字典中获取内容。

*任意对象的无序集合

与列表不同,保存在字典中的项并没有特定的顺序。实际上,Python将各项从左到右随机排序,以便快速查找。键提供了字典中项的象征性位置(而非物理性的)。

*可变,异构,任意嵌套

与列表相似,字典可以在原处增长或是缩短(无需生成一份拷贝),可以包含任何类型的对象,支持任意深度的嵌套,可以包含列表和其他字典等。

*属于可变映射类型

通过给索引赋值,字典可以在原处修改。但不支持用于字符串和列表中的序列操作。因为字典是无序集合,根据固定顺序进行操作是行不通的(例如合并和分片操作)。字典是唯一内置的映射类型(键映射到值得对象)。

*对象引用表(哈希表)

如果说列表是支持位置读取对象的引用数组,那么字典就是支持键读取无序对象的引用表。从本质上讲,字典是作为哈希表(支持快速检索的数据结构)来实现的。一开始很小,并根据要求而增长。此外,Python采用最优化的哈希算法来寻找键,因此搜索是很快速的。和列表一样字典存储的是对象引用。

2、常见的字典操作

可以查看库手册或者运行dir(dict)或者help(dict),类型名为dict。当写成常量表达式时,字典以一系列"键:值(key:value)”对形式写出的,用逗号隔开,用大括号括起来。可以和列表和元组嵌套

操作                        解释

D1={}                        空字典

D={'one':1}                    增加数据

D1[key]='class'                    增加数据:已经存在就是修改,没有存在就是增加数据

D2={'name':'diege','age':18}            两项目字典

D3={'name':{'first':'diege','last':'wang'},'age':18} 嵌套

D2['name']                    以键进行索引计算

D3['name']['last']                字典嵌套字典的键索引

D['three'][0]                    字典嵌套列表的键索引

D['six'][1]                    字典嵌套元组的键索引

D2.has_key('name')                 方法:判断字典是否有name键

D2.keys()                    方法:键列表

list(D)                        获取D这个字典的的KEY的 MS按字典顺序排序成一个列表

D2.values()                      方法:值列表

'name' in D2                    方法:成员测试:注意使用key来测试

D2.copy()                     方法:拷贝

D2.get(key,deault)                方法:默认 如果key存在就返回key的value,如果不存在就设置key的value为default。但是没有改变原对象的数据

D2.update(D1)                    方法:合并。D1合并到D2,D1没有变化,D2变化。注意和字符串,列表好的合并操作”+“不同

D2.pop('age')                    方法:删除 根据key删除,并返回删除的value

len(D2)                        方法:求长(存储元素的数目)

D1[key]='class'                    方法:增加:已经存在的数据就是修改,没有存在就是增加数据

D4=dict(name='diege',age=18)            其他构造技术

D5=dict.fromkeys(['a','b'])                 其他构造技术 dict.fromkeys 可以从一个列表读取字典的key 值默认为空,可指定初始值.两个参数一个是KEY列表,一个初始值

>>> D4

{'a': None, 'b': None}

>>> D5=dict.fromkeys(['a','b','c'],0)

>>> D5

{'a': 0, 'c': 0, 'b': 0}

D6=dict(zip(keyslist.valslist))             ???

>>> D={}

>>> D={'one':1}

>>> D

{'one': 1}

列表不能通过这样的方法来增加数据,列表只能通过append方法,列表之能通过L[1]='A'这样的方法来修改已存在序列的数据。

二、实际应用中的字典

1、字典的基本操作

1)、创建字典的方法 和修改

全部数据一起添加

>>> D={'name':'diege','age':18}

>>> D

{'age': 18, 'name': 'diege'}

>>> D={}

>>> D['name']='diege'

>>> D['age']=18

>>> D

{'age': 18, 'name': 'diege'}

>>> D1['age']=19

>>> D1

{'age': 19, 'name': 'diege'}

同样键不存在是新添加数据,键存在就是修改数据

>>> D1=dict(name='diege',age=18)

>>> D1

{'age': 18, 'name': 'diege'}

将数据按按key=value作为参数传递给dict()

dict(mapping) -> new dictionary initialized from a mapping object's (key, value) pairs

>>> D=dict.fromkeys(['name','age'])

>>> D

{'age': None, 'name': None}

创建只有key没有value的字典。

>>> D=dict.fromkeys(['name','age'],0)

>>> D

{'age': 0, 'name': 0}

2)、索引

>>> D['age']

18

3)、取长

>>> len(D)

2

4)、键存在判断-参数使用key

>>> D.has_key('name')

True

5)、成员判断 使用key

>>> 'age' in D

True

6)、字典的键查看 返回键的列表

>>> D.keys()

['age', 'name']

7)、字典的值查看 返回值的列表

>>> D.values()

[18, 'diege']

8)、拷贝

D2.copy()

2、原处修改字典

1)增加数据

>>> D['age']=18

>>> D

{'age': 18, 'name': 'diege'}

>>> D1['age']=19

>>> D1

{'age': 19, 'name': 'diege'}

同样键不存在是新添加数据,键存在就是修改数据

2)删除数据

根据键删除

pop方法是从字典中删除一个键并返回它的值

>>> D.pop('age')

18

方法是从字典中删除一个键并返回它的值

>>> del D['age']

18

从字典前面一对K:V的方式删除,并返回K,V合成的元组

>>> D3.popitem()

('age', 18)

清空字典所有数据

D1.clear()

3)合并数据

D2.update(D1)                    方法:合并。D1合并到D2,D1没有变化,D2变化。注意和字符串,列表好的合并操作”+“不同

>>> D1

{'name': 'diege'}

>>> D2

{'class': 2, 'level': 2012}

>>> D2.update(D1)

>>> D1

{'name': 'diege'}

>>> D2

{'class': 2, 'name': 'diege', 'level': 2012}

3、其他字典方法

字典方法提供很多工具,例如 字典keys,valuse和items方法分别返回字典的键列表,值列表和(key,value)对元组

key列表

>>> D2.keys()

['class', 'name', 'level']

value列表

>>> D2.values()

[2, 'diege', 2012]

K,V元组的列表

>>> D2.items()

[('class', 2), ('name', 'diege'), ('level', 2012)]

>>> D2.viewkeys()

dict_keys(['class', 'name', 'level'])

>>> D2.viewvalues()

dict_values([2, 'diege', 2012])

>>> D2.viewitems()

dict_items([('class', 2), ('name', 'diege'), ('level', 2012)])

4、语言表

>>> table={'Python':'Guido',

... 'Perl':'Larry',

... 'Tcl':'John'}

for lang in table.keys():

...  print lang,'\t',table[lang]

...

Python  Guido

Tcl     John

Perl    Larry

因为字典并非序列,无法像字符串和列表那样直接通过一个for语句迭代他们。但如果要遍历字典的键列表很容易。调用字典的keys()方法,返回经过排序之后所有键的列表。再用for循环进行迭代。

实际上,Python也能然给你遍历字典的键的列表,而并不用在多数for循环中调用keys方法.就任何字典D而言,写成for key in D:和写成完整的for key in D.keys():效果是一样的

>>> for key in table:

...  print key

...

Python

Tcl

Perl

>>> for key in table.keys():

...  print key

...

Python

Tcl

Perl

>>> for key in table.values():

...  print key

...

Guido

John

Larry

三、字典用法注意事项

*序列运算无效。无法有序合并和分片

*对新索引赋值会增加项。

*键不一定总是字符串。任何不可变对象都可以(也就是不是列表)

1、使用字典模拟灵活的列表

当使用列表的时,对在列表末尾外的偏移赋值是非法的。

>>> L=[]

>>> L[99]='diege'

Traceback (most recent call last):

File "", line 1, in

IndexError: list assignment index out of range

虽然可以使用重复预先分配足够的大的列表(例如 [0]*100)。但也可以使用字典来坐类似的事。这样就不需要这样的空间分配了。

使用整数键时,字典可以效仿列表再偏移赋值时增长

>>> [0]*100>>> L=[0]*100

>>> L[99]='diege

>>> D={}

>>> D[99]='diege'

>>> D[99]

'diege

这样的不用将来可能会用到的会被赋值的所有位置都分配空间。这样字典很像更具灵活性的列表。

2、字典用于稀疏数据结构

例如多维数组中只有少数位置上有存储的值

>>> M={}

>>> M[(2,3,4)]=88

>>> M[(7,8,9)]=99

>>> X=2;Y=3;Z=4

>>> M[(X,Y,Z)]

88

>>> M

{(2, 3, 4): 88, (7, 8, 9): 99}

这个数组中只有两个位置(2,3,4),(7,8,9)有值,其他位置都未空。键是元组,他们记录非空元素的坐标。我们并不是分配一个庞大而几乎为空的三维矩阵,而是使用一个简单的两个元素的字典。通过这一方式读取空元素的时,会触发键不存在的异常。因为这些元素实质上并没有被存储。

>>> M[(5,6,7)]

Traceback (most recent call last):

File "", line 1, in

KeyError: (5, 6, 7)

3、避免missing-key错误

读取不存在的键的错误在稀疏矩阵中很常见。然而可能并不希望程序因为这一次错误而被关闭。这里有三种方式可以让我们填入默认值而不会出现这样

的错误提示,

1、)使用if语句预先对键进行测试。

>>> if M.has_key((5,6,7)):

...  print M[(5,6,7)]

... else:

...  print 0

...

0

2)、使用try语句明确地捕获并修复这一异常。

>>> try:

...  print M[(5,6,7)]

... except KeyError:

...  print 0

...

0

3)、使用get方法为不存在的键提供一个默认值

>>> M.get((2,3,4),0)

88

>>> M.get((5,6,7),0)

0

从编程的需要方面来说,get方法是三者中最简捷的。

4、使用字典作为“记录”

一般说来,字典可以取代搜索数据结构(因为用键进行索引是一种搜索操作),并且可以表示多种结构化信息的类型。例如,字典是在程序范围中多种描述某一项

属性的方法之一。也就是说,它们能偶扮演其他语言中的“记录”和结构相同的角色。随时间通过向新键赋值来填写字典的列子

>>> rec={}

>>> rec['name']='diege'

>>> rec['age']=28

>>> rec['job']='sa/db'

>>> print rec['name']

diege

特别是在嵌套的时候,Python的内建数据类型可以很轻松地表达结构化信息。使用字典来捕获对象的属性,但是它是一次性写好的,而且嵌套了一个列表和一个字典来表达结构化属性的值。

>>> offer={'name':'diege','jobs':['sa','dba'],'web':'www.skylog.cn/~diege','home':{'state':'SH','zip':8088}}

当去读嵌套对象的元素时,只要简单地吧索引操作串起来就可以了

>>> offer['name']

'diege'

>>> offer['jobs'][1]

'dba'

>>> offer['home']['state']

'SH

5、创建字典的其他方法

1)

>>> {'name':'diege','age':45}

{'age': 45, 'name': 'diege'}

2)

>>> D={}

>>> D['name']='lily'

>>> D['age']=18

>>> D

{'age': 18, 'name': 'lily'}

3)

>>> dict(name='kelly',age=19)

{'age': 19, 'name': 'kelly'}

注意这里name,age没有 ’‘括起来,因为这里是变量。

4)

>>> dict([('name','tom'),('age',23)])

{'age': 23, 'name': 'tom'}

这里将每一个数据(属性),做为元组放到一个列表里传递给dict函数

4种方法的选择技巧

*如果可以事先拼除整个字典,那么第一种是很方便的。

*如果需要一次动态地建立字典的一个字段,第二种比较合适

*第三种关键字形式所需的代码比常量少,【但是键必须是都是字符串才可行】

*如果需要在程序运行时把键和值逐步建成序列。第四中比较有用。

zip函数把程序运行动态获得的键和值列表合并在一起(例如分析数据文件字段)

如果所有键的值都相同,可以使用特殊形式对字典进行初始化。简单传入一个键列表,以及所有键的初始值(默认为空)

>>> dict.fromkeys(['a','b','c'],0)

{'a': 0, 'c': 0, 'b': 0}

python字典数据类型笔记_Python学习笔记整理(六)Python中的字典相关推荐

  1. 在python中len表示的数据类型是_Python学习笔记——Python数据类型

    1.列表1.1取单个值 1.2切片获取子列表 1.3用len()函数获取列表长度 1.4列表的循环 1.5列表的链接和复制 1.6列表的增.删.查 1.7列表的排序--sort()方法 2.字符串2. ...

  2. python的基本数据结构_Python学习笔记——基本数据结构

    列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...

  3. python的基本数据结构_python学习笔记-基本数据结构

    Python 学习笔记-1 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护 python 基本情况 代 ...

  4. python __name__怎么使用_python学习笔记26(python中__name__的使用)

    在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以import它给其他客户使用,这两种情况不一样. 1. 如果模块是被导入 ...

  5. python查看方法作用_python学习笔记1,新手小白也能看得懂

    这是酸菜在风变编程上学习python时积累的学习笔记,希望能帮到同样也在学习中的小伙伴.持续更新~ 第0关 Print()函数 (1)不带引号:让计算机读懂括号里的内容,打印最终的结果 例:print ...

  6. python编辑器文字放大_python学习笔记000

    写在最前面 其实想学习编程很久了,以前也陆陆续续学习过一段时间的编程,但总是半途而废,经过我长达三秒钟的思考,总结出以下两个方面的原因: 1.没有学习的压力.因为我不是程序员,编程不是我吃饭的家伙,会 ...

  7. python 异步加载_Python学习笔记4——爬取异步加载数据

    一.什么是异步加载? 在之前的学习笔记中,爬取的网页是需要手动翻页的网址,但是一些网站是通过自动加载翻页的,如knewone网页.浏览knewone的官网就能发现,当下拉到网页最下端时,网站会自动加载 ...

  8. python用法查询笔记_Python学习笔记 - 2 - PyCharm的基本使用

    什么是IDE 开始学习的小白同学,一看到这三个字母应该是懵逼的,那么我们一点一点来说. 既然学习Python语言我们就需要写代码,那么代码写在哪里呢?在记事本里写 在word文档里写 在sublime ...

  9. python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度

    python学习笔记--坐标轴刻度 所用的库及环境: ide:pycharm python环境:python3.7 matplotlib:   matplotlib 1.11 numpy:  nump ...

最新文章

  1. Python的数据库操作(Sqlalchemy)
  2. 汉中职业技术学院计算机专业,2020年陕西省青年职业技能大赛计算机网络管理员决赛开幕式在汉中职院举行...
  3. 还在熬夜憋思路?这12篇最新论文打包送给你 | 本周值得读
  4. MVC命名空间中的~UrlHelper中的Action方法告诉我们方法重载的重要性(路由的统一)...
  5. Struts2和Spring3 MVC的区别说明
  6. 神奇的 37% 的概率
  7. android studio开发个人备忘录算法设计_Android Studio 4.1 发布,全方位提升开发体验...
  8. mac上启用tftp服务器
  9. 我喜欢用计算机400字,我喜欢电脑画画作文400字
  10. maven下载安装及配置
  11. mysql repaire_Repair MySQL Replication遇到的错误(一)
  12. 强化学习10——迭代学习
  13. 通达OA系统管理员操作手册
  14. 神奇的零知识证明,既能保守秘密,又能让别人信你!
  15. 高德地图开发踩坑记录
  16. Web中间件常见安全漏洞
  17. STM32F103高级定时器死区时间计算
  18. 0讲 | 原理图库绘制元器件
  19. 工业智能网关BL110应用之13:实现三菱 PLC FX3S 接入华为云平台
  20. 【夯实基础 】 js获取的clientHeight、offsetHeight和scrollHeight的区别

热门文章

  1. 如何用php向wsdl服务器发请求,知道服务器端Wsdl,不写服务端代码,仅写客户端代码能调用服务端的方法吗?...
  2. 从源码分析DEARGUI之画图和删图
  3. vue中一个组件导入另一个组件
  4. Javascript标准DOM Range操作
  5. redis安装教程 windows环境
  6. JavaScript函数的反应性
  7. Jenkins使用遇到的问题总结
  8. rocketMq-producer介绍
  9. Shodan搜索引擎开始披露恶意软件控制服务器
  10. 2016 、12 、11本周