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.字典推导式
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'] 会按照以下的步骤来行事
- 调用 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。如果给这个类一个映射,它会返回一个只读的映射视图。虽然是个只读视图,但是它是动态的。这意味着如果对原映射做出了改动,我们通过这个视图可以观察到,但是无法通过这个视图对原映射做出修改。