Python的dict字典结构操作方法学习笔记


Posted in Python onMay 07, 2016

一.字典的基本方法

1.新建字典

1)、建立一个空的字典

>>> dict1={} 
>>> dict2=dict() 
>>> dict1,dict2 
({}, {})

2)、新建的时候初始化一个值

>>> dict1={1:'a',2:'b',3:'c'} 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

3)、利用元组

>>> dict1=dict([(1,'a'),(2,'b'),(3,'c')]) 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

2、获取方法

1)、get(key) 从字典中获取一个key对应的value,返回value

>>> dict1={1:'a',2:'b',3:'c'} 
>>> dict1.get(1) 
'a'

如果字典里面不存在,则返回一个 NoneType

>>> type(dict1.get(4)) 
<type 'NoneType'>

如果要求key值不存在,指定另外一个值返回的话

>>> dict1.get(4,'not found') 
'not found'

2)、keys() 获取字典中所有的key值,返回一个列表

>>> dict1.keys() 
[1, 2, 3]

3)、values() 与keys()方法对应,返回的字典中的所有value的列表

>>> dict1.values() 
['a', 'b', 'c']

4)、items() 返回一个 (key,value)对应的元组

>>> dict1.items() 
[(1, 'a'), (2, 'b'), (3, 'c')]

5)、iterkeys() , itervalues() , iteritems() 也是分别获取所有的key,value,(key,value)元祖,只是不在是返回列表,而是一个迭代器

>>> for key in dict1.iterkeys(): 
 print key 
1 
2 
3

3、设置字典值的方法

1)、直接的方法就是

>>> dict1[4]='d' 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}

但是,这个方法就是,如果我想添加的key值已经在字典中,那么就会覆盖掉原来的value值

>>> dict1[4]='e' 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c', 4: 'e'}

2)、setdefault(key,value) 这个方法的好处就是,如果插入的key不存在字典中,那么插入字典并返回该value,否则的存在于字典中的话,那么返回存在的value,不会覆盖掉

>>> dict1 
{1: 'a', 2: 'b', 3: 'c', 4: 'e'} 
>>> dict1.setdefault(5,'f') 
'f' 
>>> dict1.setdefault(5,'g') 
'f' 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c', 4: 'e', 5: 'f'}

4、删除字典

1)pop(key) 删除指定key的一项,成功返回一个删除项的value, 如果不存在,会抛出异常,所以在用这个方法时候,都要用判断 key是否存在,或者catch这个异常

>>> def pop_key(d,key): 
 try: 
 d.pop(key) 
 print "sucess" 
 except: 
 print "key is not in dict" 
>>> dict1 
{1: 'a', 2: 'b'} 
>>> pop_key(dict1,3) 
key is not in dict

或者

>>> def sub_dict2(d,key): 
 if d.has_key(key): 
 d.pop(key) 
 print "sucess" 
 else:print "key is not in dict" 
 
>>> pop_key(dict1,3) 
key is not in dict

这里的has_key(key)就是判断字典里面是否有该key,当然,也可以用 key in d 来代替

2) popitem() 和pop()类似,只是他是删除一个(key,value)的元组

利用上面的方法,可以得使用一些进阶的用法

A、我们通过2个列表来创建一个字典,第一个列表是所有的key,第二个列表是所有的value

>>> list1=[1,2,3] 
>>> list2=['a','b','c'] 
>>> dict1=dict(zip(list1,list2)) 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'}

B、找出某一个字典的子字典

>>> dict1 
{1: 'a', 2: 'b', 3: 'c'} 
>>> dict1=dict([(1,'a'),(2,'b'),(3,'c')]) 
>>> dict1 
{1: 'a', 2: 'b', 3: 'c'} 
>>> subkeys=[1,3] 
>>> def sub_dict(d,subkeys): 
 return dict([(k,d.get(k)) for k in subkeys if k in d]) 
 
>>> print sub_dict(dict1,subkeys) 
{1: 'a', 3: 'c'}

C、反转字典,也就是key变成新字典的value,value变成新字典的key(注意,如果value值有重复,反转后的字典就只会保留一个

>>> def invert_dict(d): 
 return dict([(k,v) for v,k in d.iteritems()]) 
 
>>> print invert_dict(dict1) 
{'a': 1, 'c': 3, 'b': 2} 
>>>

5、其他基本的方法

1) has_key(key) 判断key是否在字典中

2)copy()返回一个字典的副本(该复制是一个浅复制)

>>> d2={1:[1],2:[2],3:[3]} 
>>> d3=d2.copy() 
>>> d3[1].append(4) 
>>> d2[1] 
[1, 4]

如果要深复制的话,就要用到copy.deepcopy(a)

>>> d2={1:[1],2:[2],3:[3]} 
>>> import copy 
>>> d3=copy.deepcopy(d2) 
>>> d3[1].append(4) 
>>> print d2[1] , d3[1] 
[1] [1, 4]

3)clear( ) 清空dict

4)update(d) 用一个字典来跟新另外一个字典,有点类似与2个字典的合并

>>> dict1={1: 'a', 2: 'b', 3: 'c'} 
>>> dict2={1:'x',4:'y'} 
>>> dict1.update(dict2) 
>>> dict1 
{1: 'x', 2: 'b', 3: 'c', 4: 'y'} 
>>>

二、遍历

字典的遍历方法很多

1、直接利用dict

>>> d 
{'a': 'aa', 'c': 'cc', 'b': 'bb'} 
>>> for i in d: 
 print i,d[i] 
 
a aa 
c cc 
b bb

2、利用items()

>>> for i,v in d.items(): 
 print i,v 
 
a aa 
c cc 
b bb

当然也可以这样

>>> for (i,v) in d.items(): 
 print i,v 
 
a aa 
c cc 
b bb

我印象中有个文章就是比较这2个方法(有括号和没括号)的效率,说字典大小在200以下时候,有括号速度快一点,200以上时候,无括号速度快一点,具体我也没测试。

3、iteritems()
(我觉得比较好的方法)

>>> for k,v in d.iteritems(): 
 print k,v 
 
a aa 
c cc 
b bb

其他还有些遍历方法,但是我感觉就这3个就足够了

三、一些进阶用法

1、一键多值

一般情况,字典都是一对一映射的,但如果我们需要一对多的映射,比如一本书,我们要统计一些单词出现的页数。那么,可以用list作为dict的value值。在利用setdefault()方法就可以完成

>>> d={'hello':[1,4,9],"good":[1,3,6]} 
>>> d 
{'good': [1, 3, 6], 'hello': [1, 4, 9]} 
>>> d.setdefault('good',[]).append(7) 
>>> d 
{'good': [1, 3, 6, 7], 'hello': [1, 4, 9]} 
>>> d.setdefault('bad',[]).append(2) 
>>> d 
{'bad': [2], 'good': [1, 3, 6, 7], 'hello': [1, 4, 9]} 
>>>

当然,如果写成一个函数话,就可以更方便的使用,
我们也可以利用set来代替list

>>> def addFunc(d,word,pag): 
 d.setdefault(word,set()).add(pag) 
>>> d={'hello':set([1,4,9]),"good":set([1,3,6])} 
>>> addFunc(d,'hello',8) 
>>> d 
{'good': set([1, 3, 6]), 'hello': set([8, 1, 4, 9])} 
>>> addFunc(d,'bad',8) 
>>> d 
{'bad': set([8]), 'good': set([1, 3, 6]), 'hello': set([8, 1, 4, 9])}

2、利用字典完成简单工厂模式
字典的value不单单只是一些常见的字符串,数值,还可以是类和方法,比如我们就可以这样来实现简单工厂模式

>>> class cat(object): 
 def __init__(self): 
 print 'cat init' 
>>> class dog(object): 
 def __init__(self): 
 print 'dag init' 
>>> d={'cat':cat,'dog':dog} 
>>> def factoryFunc(d,name): 
 if name in d: 
 return d[name]() 
 else: 
 raise Exception("error") 
>>> cat=factoryFunc(d,'cat') 
cat init

另外一个例子,利用变量来控制执行的函数

>>> def deal_cat(): 
 print 'cat run!!' 
 
>>> def deal_dog(): 
 print 'dag run!!' 
 
>>> d={'cat':deal_cat ,'dog':deal_dog } 
>>> animal='cat' 
>>> d[animal]() 
cat run!!
Python 相关文章推荐
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
全面理解Python中self的用法
Jun 04 Python
python实现定时提取实时日志程序
Jun 22 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
学习python可以干什么
Feb 26 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
基于python实现文件加密功能
Jan 06 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
Python 类与元类的深度挖掘 II【经验】
May 06 #Python
Python 类与元类的深度挖掘 I【经验】
May 06 #Python
Python 迭代器工具包【推荐】
May 06 #Python
Python中内建函数的简单用法说明
May 05 #Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 #Python
Python环境下搭建属于自己的pip源的教程
May 05 #Python
使用Python判断质数(素数)的简单方法讲解
May 05 #Python
You might like
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
node.js如何操作MySQL数据库
2020/10/29 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
使用python 获取进程pid号的方法
2014/03/10 Python
python的即时标记项目练习笔记
2014/09/18 Python
用python读写excel的方法
2014/11/18 Python
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
Python中特殊函数集锦
2015/07/27 Python
django文档学习之applications使用详解
2018/01/29 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
python数据类型强制转换实例详解
2020/06/22 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
历史学专业个人的自我评价
2013/10/13 职场文书
烹调加工管理制度
2014/02/04 职场文书
学校后勤岗位职责
2014/02/19 职场文书
英文感谢信格式
2015/01/21 职场文书
教师网络培训心得体会
2016/01/09 职场文书
物业管理交接协议书
2016/03/24 职场文书
如何用python反转图片,视频
2021/04/24 Python
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers