fluent_python2

字典和集合

泛映射类型, 继承自collections.abc, Mapping和MutableMapping

标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可散列的数据类型才能用作这些映射里的键(只有键有这个要求,值并不需要是可散列的数据类型)。

如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__() 方法。另外可散列对象还要有__qe__() 方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的......

一般来讲用户自定义的类型的对象都是可散列的,散列值就是它们的 id() 函数的返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象实现了 __eq__ 方法,并且在方法中用到了这个对象的内部状态的话,那么只有当所有这些内部状态都是不可变的情况下,这个对象才是可散列的。

创建字典的方法:

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True

字典推导, 类似列表推导, 在根据输入创建新的字典.

    DIAL_CODES = [
        (86, 'China'),
        (91, 'India'),
        (1, 'United States'),
        (62, 'Indonesia'),
        (55, 'Brazil'),
        (92, 'Pakistan'),
        (880, 'Bangladesh'),
        (234, 'Nigeria'),
        (7, 'Russia'),
        (81, 'Japan'),
    ]
    country_code = {country: code for code, country in DIAL_CODES}
    print(country_code)

遇到找不到的键, 可以用dict.setdefault()在一次键查询的时候就进行赋值或返回default值. 而有时候可以通过另外两种方法得到一种是使用类defaultdict, 另一个是继承dict, 然后在子类中实现__missing__()方法.

使用 defaultdict 的时候, 给构造方法传递一个可调用对象. collections.defaultdict(default_factory), 这个可调用对象会在 __getitem__ 碰到找不到的键的时候被调用,让 __getitem__ 返回某种默认值。

这里的default_factory是一个函数, 但是仅仅在 __getitem__ 函数中会被调用, 其他不会有效. 如:

dd = defaultdict(default_factory)
dd[k] = [] # 会调用 __getitem__ 和 default_factory
dd.get(k) # 不会调用 __getitem__ 和 default_factory

以上的实现本质上是有一个 __missing__ 方法. 如果有类继承了dict, 且实现了__missing__ 当找不到的时候会调用该方法, 而不是抛出KeyError.

__missing__ 方法只会被 __getitem__ 调用, 而不会被 get 或者 __contains__ 方法调用.

原文地址:https://www.cnblogs.com/putuotingchan/p/8628780.html