• Python中Dict类型的操作介绍

    关于字典(dictionary)
    服务器君一共花费 8.691 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    前面字典 dict 实现 switch 这样的功能,但是没有深入介绍 dict 这个数据类型,这里开始补充下。

    字典 dict,是 Python 唯一的标准 mapping 类型,也是内置在 Python 解释器中的。mapping object 把一个可哈希的值(hashable value)映射到一个任意的 object 上。

    什么是可哈希(hashable)的?一个 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,关于后面会解释。

    字典的创建

    dict 本身是一个类,可以通过 dict 类来构建字典:

    >>> d = dict({1:'a', 2:'b', 3:'c'})
    >>> d
    {1: 'a', 2: 'b', 3: 'c'}
    >>> d2 = {1:'a', 2:'b', 3:'c'}
    >>> d2
    {1: 'a', 2: 'b', 3: 'c'}
    >>> 
    

    那么字典这个数据类型有什么好处呢?它提供了很多方便的操作:

    dictionary支持的操作

    1. 引用元素

    直接用d[key],就可以得到key所对应得那个object:

    >>> d2 = {1:'a', 2:'b', 3:'c'}
    >>> d2
    {1: 'a', 2: 'b', 3: 'c'}
    >>> d2[1]
    'a'
    

    但是如果key不存在呢,如果使用的就是标准的dict,那么会抛出KeyError异常。但是如果我们是自己从dict派生了一个自己的dictionary,那么只要我们定义__missing__函数,当key不存在时,这个函数会以key做为参数被调用,我们试验一下。

    写一个module,mdict.py:

    class myDict(dict):
    	def __missing__(self, key):
    		print "__missing__ called , key = ", key
    		return "nowamagic.net"
    

    然后打开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
    nowamagic.net
    

    可以看到__missing__()被调用了。

    如果只想得到某个key对应的value,不想对其进行改变,则用类方法get() ,这类似C++中“引用”和“值”的概念。

    >>> a = d.get(1)
    >>> a
    'a'
    

    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]
    

    3. 内置函数实现的操作

    >>>len(d)    #dictionary的长度
    >>>del d[key]  或  del  d      #del语句
    >>>key in d 或 key not in d     #返回True or False 
    

    因为操作的便利,Dict 类型在 Python 应用很广泛。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
  2. [JavaScript程序设计] jQuery与表单操作 2 个条目
  3. [运维管理] 路由器与交换机 4 个条目
  4. [移动开发] Android里的ContentValues 2 个条目
  5. [软件工程与项目管理] 浏览器与CSS渲染技巧 2 个条目
  6. [移动开发] Android View注入框架Butter Knife 3 个条目
  7. [智力开发与知识管理] 整体性学习策略 9 个条目
  8. [PHP程序设计] 对输入文件类型的检测 1 个条目
  9. [移动开发] 刷机与root相关 2 个条目
  10. [PHP程序设计] 命令式编程范式 6 个条目
  11. [移动开发] 从代码角度去认识 Thread 9 个条目
  12. [移动开发] Android开发基础知识 4 个条目
窗口 -- [资讯]