美文网首页
python字典

python字典

作者: 第八共同体 | 来源:发表于2017-11-21 15:42 被阅读0次

    1. 简介

    只有可散列的数据类型才能作为字典的键,原子不可变数据类型(str、bytes 和数值类型)都是可散列类型,frozenset 也是
    可散列的,因为根据其定义,frozenset 里只能容纳可散列类型。

    a = dict(one=1,two=2,three=3)
    
    b = {'one':1,'two':2,'three':3}
    
    set1 = {'one','two','three'}
    
    set2 = {1,2,3}
    
    c = dict(zip(set1,set2))   # zip() 函数的返回结果为 [('one', 1), ('three', 3), ('two', 2)] type is list
    
    d = dict({'three':3,'one':1,'two':2})
    
    a == b == c == d   # 返回值True
    

    除了这些字面句法和灵活的构造方法之外,字典推导(dict comprehension)也可以用来建造新 dict.

    2.字典推导式

    image.png

    3.字典上可进行的操作

    len(a)                        # 返回字典长度
    a[key]                       # 返回字段key值为key的元素值,如果key 不在 字典中,报KeyError。
    a[key] = value           # 设置a[key] 的值为value
    iter(a)                        # 返回一个迭代器,元素由字典所有的键组成
    key in a // key not in a   # a 中key 存在返回True,否则False// 相反,存在返回False,不存在返回True
    e = a.copy()                 # 浅拷贝
    f = fromkeys(seq[, value])         # 以seq为键值创建一个新的字典,values设置为value 该方法为字典类的方法
    f = a.fromkeys(set1,None)       # 返回以set1元素为key值的 None为键值的字典 :{1: None, 2: None, 3: None}
    value1 = get(key[,default])       # 如果key存在,返回key的值否则,返回default的值,default 默认为None.
    element_list = items()              # 返回以键值对为元素的列表。[(key,value),....]
    ele_iter  = iteritems()                 #返回以键值对为元素的迭代器。
    iterkey() /// itervalues()           #........
    keys()      ///value()                 # 返回一个列表,元素为字典的键/////值
    pop(key[, default]) # 如果key 在字典中移除,并返回他的值,如果给出default,返回default。如果default未给,并且key不在字典中,报KeyError.
    popitem()                   # 移除并返回任意键值对。
    setdefault(key[, default])   # 如果key 在字典中,返回他的值,如果不在,插入到字典中,键为key,值为default 并返回default,default默认为None
    update([other])                 # 更新一个字典,加入other中的键值对。
    a.update({'four':4})            # a =   {'three': 3, 'two': 1, 'one': 1,'four':4}
    

    4. defaultdict:处理找不到的键的一个选择

    创建 defaultdict 对象的时候,就需要给它配置一个为找不到的键创造默认值的方法。具体而言,在实例化一个 defaultdict 的时候,需要给构造方法提供一个可调用对象,这个可调用对象会在 getitem 碰到找不到的键的时候被调用,让 getitem
    回某种默认值。比如,我们新建了这样一个字典:
    dd = defaultdict(list),如果键 'new-key' 在 dd中还不存在的话,表达式 dd['new-key'] 会按照以下的步骤来行事

      1. 调用 list() 来建立一个新列表。
    • 2 把这个新列表作为值,'new-key' 作为它的键,放到 dd 中。
    • 3 返回这个列表的引用。
    import collections
    dd = collections.defaultdict(list)
    print dd['zhao']      #输出值为[]
    pring dd                # defaultdict(<type 'list'>, { 'zhao': []})
    

    上述例子中,

    1.使用list作为default_factory 来创建一个defaultdict,它是用来生产默认值的可调用对象。
    2.如果创建defaultdict的时候没有指定default_factory,查询不存在的键会触发KeyError.
    3.defaultdict里面的default-factory只会在_getitem_里面被调用,在其他方法里面完全不会发挥作用。比如,上面例子中,dd['zhao']会调用default_factory,但是,dd.get('xxx')不回调用,而是返回None.

    而这个用来生成默认值的可调用对象存放在名为 default_factory 的实例属性里.如果在创建 defaultdict 的时候没有指定default_factory,查询不存在的键会触发KeyError.所有这一切背后的功臣其实是特殊方法 missing。它会在 defaultdict 遇到找不到的键的时候调用 default_factory,而实际上这个特性是所有映射类型都可以选择去支持的。

    5.字典的变种

    5.1.collections.Counter

    这个映射类型会给键准备一个整数计数器。每次更新一个键的时候都会增加这个计数器。所以这个类型可以用来给可散列表对象计数,或者是当成多重集来用——多重集合就是集合里的元素可以出现不止一次。Counter 实现了 + 和 - 运算符用来合并记录,还有像 most_common([n]) 这类很有用的方法。most_common([n]) 会按照次序返回映射里最常见的 n 个键和它们的计数。

    import collections
    ct = collections.Counter(['zhao','zhao','linpeng','peng','peng','peng'])
    print ct   #output:Counter({'peng': 3, 'zhao': 2, 'linpeng': 1})
    print ct.most_common(2)   # output: [('peng', 3), ('zhao', 2)]
    

    5.2.collections.OrderedDict

    这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致的。OrderedDict 的 popitem 方法默认删除并返回的是字典里的最后一个元素,但是如果像 my_odict.popitem(last=False) 这样调用它,那么它删除并返回第一个被添加进去的元素。

    5.3.collections.ChainMap

    该类型可以容纳数个不同的映射对象,然后在进行键查找操作的时候,这些对象会被当作一个整体被逐个查找,直到键被找到为止。这个功能在给有嵌套作用域的语言做解释器的时候很有用,可以用一个映射对象来代表一个作用域的上下文。

    5.4.colllections.UserDict

    这个类其实就是把标准 dict 用纯 Python 又实现了一遍。跟 OrderedDict、ChainMap 和 Counter 这些开箱即用的类型不同,UserDict 是让用户继承写子类的。更倾向于从 UserDict 而不是从 dict 继承的主要原因是,后者有时会在某些方法的实现上走一些捷径,导致我们不得不在它的子类中重写这些方法,但是 UserDict 就不会带来这些问题.
      UserDict 并不是 dict 的子类,但是 UserDict 有一个叫作 data 的属性,是 dict 的实例,这个属性实际上是 UserDict 最终存储数据的地方。

    5.5.最后介绍一种不可变映射对象,type 模块中的MappingProxyType

      types 模块中引入了一个封装类名叫 MappingProxyType。如果给这个类一个映射,它会返回一个只读的映射视图。虽然是个只读视图,但是它是动态的。这意味着如果对原映射做出了改动,我们通过这个视图可以观察到,但是无法通过这个视图对原映射做出修改。

    image.png

    相关文章

      网友评论

          本文标题:python字典

          本文链接:https://www.haomeiwen.com/subject/kkjwvxtx.html