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多线程编程简单介绍
Apr 13 Python
用tensorflow搭建CNN的方法
Mar 05 Python
Python实现基于POS算法的区块链
Aug 07 Python
详解python使用turtle库来画一朵花
Mar 21 Python
python2和python3在处理字符串上的区别详解
May 29 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python之Class&amp;Object用法详解
Dec 25 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 Python
Python实现批量自动整理文件
Mar 16 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
星际原理概述
2020/03/04 星际争霸
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
php读取本地json文件的实例
2018/03/07 PHP
Jquery练习之表单验证实现代码
2010/12/14 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
Python本地与全局命名空间用法实例
2015/06/16 Python
python3操作mysql数据库的方法
2017/06/23 Python
python 实现登录网页的操作方法
2018/05/11 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
python算的上脚本语言吗
2020/06/22 Python
《陋室铭》教学反思
2014/02/26 职场文书
比赛口号大全
2014/06/10 职场文书
2016新年慰问信范文
2015/03/25 职场文书
贫困生证明范文
2015/06/16 职场文书
环保建议书作文500字
2015/09/14 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS