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

[经验分享] Python字典 (dictionary)

[复制链接]

尚未签到

发表于 2015-4-20 08:46:03 | 显示全部楼层 |阅读模式
  字典dict,是Python唯一的标准mapping类型,也是内置在Python解释器中的。
  mapping object把一个可哈希的值(hashable value)映射到一个任意的object上。
  什么是可哈希的
  一个object是可哈希的(hashable), 是指这个object在其生存期内有一个不变的哈希值(hash value),即__hash__()方法返回的值。
  所有不可变的(immutable)内置object都是hashable的,比如string,tuple。所有可变的(mutable)内置容器都不是hashable的,比如list,dict(即没有__hash__()方法)。而所有自定义的类(use-defined class)对象都是可哈希的(hashable),并且只能和自己相等,其hashvalue为其id(object)的值,这里的id()为内置函数,CPython实现的时候取的对象在内存中的地址。
  字典Dictionary的key必须是可哈希的,所以tuple,string可以做key,而list不能做key,关于这个我以后会专门解释,或参见文末参考第3篇。
  dict本身是一个类
  class dict(mapping)
  1,字典的创建



>>> d = dict({1:'a', 2:'b', 3:'c'})      #通过dict类来构建
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d2 = {1:'a', 2:'b', 3:'c'}           #直接构建,注意语法,大括号,冒号,逗号
>>> d2
{1: 'a', 2: 'b', 3: 'c'}

  
  2,dictionary支持的操作
  作为Python唯一的标准mapping type,dictionary支持了增,删,查,整体更新等操作。
  一部分操作是由dict的成员函数实现的,一部分操作是由Python的内置函数(built-in)function实现的,也有使用Python的del语句
  2.1 引用元素
  直接用d[key],就可以得到key所对应得那个object,但是如果key不存在呢,如果使用的就是标准的dict,那么会抛出KeyError异常。但是如果我们是自己从dict派生了一个自己的dictionary,那么只要我们定义__missing__函数,当key不存在时,这个函数会以key做为参数被调用,我们试验一下。
  写一个module  ,mdict.py



1 class myDict(dict):
2         def __missing__(self, key):
3                 print "__missing__ called , key = ", key
4                 return "^_^"
  然后打开Python命令行解释器,import mdict



>>> from mdict import myDict
>>> d = myDict({1:'a', 2:'b', 3:'c'})
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d[1]
'a'
>>> d[4]
__missing__ called , key =  4
^_^
  可以看到__missing__()被调用了。
  如果只想得到某个key对应的value,不想对其进行改变,则用对象方法get() ,这类似C++中“引用”和“值”的概念。



>>> a = d.get(1)
>>> a
'a'
  
  2.2  类方法实现的操作
  >>>d.clear()     #清空
  >>>d.copy()     #拷贝生成另一个,浅拷贝(shallow copy)
  d.keys(),d.values(),d.items()
  这三个都会生成dictionary相应的keys,values,items的copy,返回结果都是list,d.items()生成的是(key,value)二元tuple的list



>>> d.items()
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> d.keys()
[1, 2, 3]
>>> d.values()
['a', 'b', 'c']
  d.viewkeys(),d.viewvalues(),d.viewitems()
  这三个都会生成dictionary相应的view object,view object是dictionary中(key,value)的动态反映,当dictionary中的内容变化时,view object也会变。



>>> viewkeys = d.viewkeys()
>>> viewkeys
dict_keys([1, 2, 3])
>>> list(viewkeys)
[1, 2, 3]
>>> del d[1]
>>> list(viewkeys)
[2, 3]
  
  2.3 内置函数实现的操作
  >>>len(d)    #dictionary的长度
  >>>del d[key]  或  del  d      #del语句
  >>>key in d 或 key not in d     #返回True or False
  
  
  3, 字典的bool判断
  Python的对象都可以直接用来判断其bool值,对内置的字典来说,当其为空时为False,不为空时True



>>> d = {}
>>> bool(d)
False
  
  
  
  参考:
  1,  http://docs.python.org/3/library/stdtypes.html#mapping-types-dict   Python 标准库
  2,  http://docs.python.org/3/glossary.html#term-hashable   Python 术语
  3,  http://wiki.python.org/moin/DictionaryKeys   为什么List不能做dictionary的key

运维网声明 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-58637-1-1.html 上篇帖子: 使用Python创建简单的HTTP和FTP服务 下篇帖子: Python的Decorator 杂谈
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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