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 相关文章推荐
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
Python基于PycURL实现POST的方法
Jul 25 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
Python实现App自动签到领取积分功能
Sep 29 Python
python aiohttp的使用详解
Jun 20 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
django 简单实现登录验证给你
Nov 06 Python
Python实现中值滤波去噪方式
Dec 18 Python
Python数据正态性检验实现过程
Apr 18 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
Python 无限级分类树状结构生成算法的实现
Jan 21 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
node内置调试方法总结
2018/02/22 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
如何搜索查找并解决Django相关的问题
2014/06/30 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
.net面试题
2015/12/22 面试题
委托书范文
2014/04/02 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server