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 相关文章推荐
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
Python入门之后再看点什么好?
Mar 05 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
python线程的几种创建方式详解
Aug 29 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
python raise的基本使用
Sep 10 Python
python 实现socket服务端并发的四种方式
Dec 14 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
loading动画特效小结
2017/01/22 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
js实现电灯开关效果
2021/01/19 Javascript
介绍Python中几个常用的类方法
2015/04/08 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
同程旅游英文网站:LY.com
2018/11/13 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
Java面试题汇总
2015/12/06 面试题
焊接专业毕业生求职信
2013/10/01 职场文书
优秀求职信范文分享
2013/12/19 职场文书
娱乐节目策划方案
2014/06/10 职场文书
小学生安全责任书
2014/07/25 职场文书
面试自我评价范文
2014/09/17 职场文书
骨干教师事迹材料
2014/12/17 职场文书
部门2015年度工作总结
2015/04/29 职场文书
简爱读书笔记
2015/06/26 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python