设为首页 收藏本站
查看: 820|回复: 0

[经验分享] python 系统学习笔记(五)---字典

[复制链接]

尚未签到

发表于 2017-5-4 12:56:00 | 显示全部楼层 |阅读模式
字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情

况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。

注意,你只能使用不可变的对象(比如字符串)来作为字典的键,但是你可以不可变或可变的对象作为字

典的值。基本说来就是,你应该只使用简单的对象作为键。

键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的

键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。

记住字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。

字典是dict类的实例/对象。







dictionary: 字典(即C++标准库的map)

dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}

每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。

键是唯一的,字典只认最后一个赋的键值。




  • 通过键来存取,而非偏移量;
  • 键值对是无序的;
  • 键和值可以是任意对象;
  • 长度可变,任意嵌套;
  • 在字典里,不能再有序列操作,虽然字典在某些方面与列表类似,但不要把列表套在字典上




  • 字典的创建


1.直接创建:phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}(键和值用冒号隔开,各个键值对键用逗号隔开)


2.dict函数:



  >>>items=[('name','Gumby'),('age',42)]#dict的第一种方法



  >>>d=dict(items)




  {'age':42,'name':'Gumby'}




  >>>d=dict(name='Gumby',age=42)#dict的第二种方法




{'age':42,'name':'Gumby'}




  >>>d['***al']='boy'




  {'age':42,'name':'Gumby','***ual':'boy'}




  • *字典的格式化字符串*(很有用)




在转换说明符中的%字符后面,可以加上用圆括号括起来的键,后面再更其他说明元素。




phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}





print "Alice's phone number is

%(Alice)s,Cecil'sphone number is%(Cecil)s"%phonebook#%(Alice)s的s表示输出字符串的意思



-->Alice's phone number is2341,Cecil'sphone number is3258



注:这类字符串格式化在模板系统中非常有用,string.Template类对于这类应用也是非常有用的。



  • 字典的方法




1.clear



清除字典中的所有项:




phonebook.clear()#phonebook是一个字典对象




2.copy



浅复制:只复制字典中的父对象,对子对象采取引用的办法。改变子对象的内容会影响到复制和被复制的字典。



例:




x={'username':'admin','machines':['foo','bar','baz']}





y=x.copy()





y['username']='Allen'





y['machines'].remove('bar')





print y





print x




输出:






{'username':'Allen','machines':['foo','baz']} #y

{'username':'admin','machines':['foo','baz']} #x 链表子对象中的值改变,会影响两个字典。子对象采取应用的方法。




深度复制deepcopy,完全复制,新字典的改变不会影响原来的字典。





from copy import deepcopy





d={'username':'admin','machines':['foo','bar','baz']}





dc=deepcopy(d)




3.fromkeys

使用给定的键建立新的字典,每个键默认对应的值为None。




{}.fromkey(['name','age'])

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

dict.fromkey(['name','age'])#直接在所有字典的类型dict上调用方法

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

dict.fromkey(['name','age'],'(unknown)')#不用None作为默认值,自己提供默认值

-->{'age':'(unknown)','name':'(unknown)'}






4.get




  get方法是一个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错。而用get就不会。



例:




>>>d={}#空字典





>>>print d['name']





Traceback........ #出错信息





>>>print d.get('name')





None #可以自定义默认值代替None,如d.get('name','N/A'),如果没有name项就打印N/A




5.has_key

检查字典中是否含有给出的键。d.has_key(k)相当于k in d。Python3.0中不包含这个函数。




>>>d={'name':'fuss'}





>>>d.has_key('age')





False





>>>d.has_key('name')





True




6.items和iteritems

items方法将所有字典项以列表方式返回。




>>>d={'name':'fu','age':24,'***al':'boy'}







>>>d.items()







[('age', 24), ('name', 'fu'), ('***ual', 'boy')] #返回没有特殊的顺序









iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表:




>>>it=d.iteritems()







>>>it







<dictionary-itemiterator object at 0x011DA580>







>>>list(it)







[('age', 24), ('name', 'fu'), ('***ual', 'boy')]






7.keys和iterkeys

  keys方法将字典中的键以列表的形式返回,而iterkeys则返回针对键的迭代器。




>>>d.keys()





['age', 'name', '***ual']




8.pop

用来获得对应于给定键的值,然后将这个键值对从字典移除。




>>>d={'x':1,'y':2}





>>>d.pop('x')





1





>>>d





{'y':2}




9.popitem

popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但popitem弹出的是随机项,以为字典没有"最后的元素"或其他有关顺序的概念。




>>>d={'x':1,'y':2}





>>>d.popitem()





('x':1) #随机的




10.setdefault

  setdefault方法在某种程度上类似于get方法,就是能获得与给定键关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。




>>>d={}





>>>d.setdefault('name','N/A')





'N/A'





>>>d





{'name':'N/A'}





>>>d['name']='Allen'





>>>d.setdefault('name','N/A')





'Allen'





>>>d





{'name':'Allen'}




11.update

  update方法可以利用一个字典项更新另外一个字典:




>>>d={'x':123,'y':456}





>>>b={'x':789}





>>>d.update(b)





>>>d





{'x':789,'y':456}




  提供的字典项会被添加到旧的字典中,若有相同的键则会进行覆盖。

12.values和itervalues

  values方法一列表的形式返回字典的值(itervalues返回值的迭代器)。与keys对比(对应关系)

例:




d={'name':'fu','age':24,'***ual':'boy'}





printd.keys()   #返回字典的键列表







print d.values()  #返回字典的值列表







['age', 'name', '***ual'] #键列表







['fu',24,'boy']  #值列表
















# -*- coding: cp936 -*-
params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
print params.keys()  
print  params.values()
print params.items()
print [ k for k, v in params.items()]               
print [v for k, v in params.items()]               
print ["%s=%s" % (k, v) for k, v in params.items()]
print params.has_key("server")
print params.get("server")
params["pwd"]="hello pwd"
print params.items()
params["hello list"]=[1,2,3,4]
print params
del params["hello list"]
print params
#print params.popitem()
#遍历
for key in params.keys():
print key, '\t', params[key]

#join 连接
print ";".join(["%s=%s" % (k, v*2) for k, v in params.items()])





利用字典实现简单的switch 类型语句。(第一节的时候已经写了)



from __future__ import division
x = 1
y = 2
operator = "/"
result = {
"+" : x + y,
"-" : x - y,
"*" : x * y,
"/" : x / y
}
print result.get(operator)

  


  练习题
  
  颠倒字典中的键和值。用一个字典做输入,输出另一个字典,用前者的键做值,前者的

值做键。但是如果value 相同要求保留前一个

  d={'abc':1,'def':2,'ghi':3,'jkl':3} =》{1:'abc',2:'def',3:'ghi'}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373061-1-1.html 上篇帖子: python 系统学习笔记(六)---元组 下篇帖子: Python IDLE代码颜色主题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表