# 第六章:深入Python的set和dict

# 6.1 dict的abc继承关系

from collections.abc import *

  • Sized: len
  • Iterable: iter
  • Container: contains
  • Collection: Sized, Iterable, Container
  • Mapping: Collection
  • MutableMapping: Mapping

可以看出来 dict 和 list 有一些共有的魔法函数


    from collections.abc import Mapping

    # dict 属于 Mapping 类型
    d = dict()
    print(isinstance(d, Mapping))

# 6.2 dict的常用方法

借助编辑器,如 PyCharm 实时查看源码


    d = {
        'linda': {'company': 'Yahoo'},
        'catherine': {'company': 'Google'}
    }

    # 清空
    # d.clear()

    # 浅拷贝
    new_dict = d.copy()
    # 深拷贝
    import copy
    new_dict_deep = copy.deepcopy(d)

    new_dict['linda']['company'] = 'Ali'
    print(d)
    print(new_dict)
    print(new_dict_deep)

    dd = dict.fromkeys(['key1', 'key2'], 'default')
    dd.get('key', None)
    dd.keys(), dd.values(), dd.items()

    # 获取key的value, 没有时更新为默认值
    print(dd.setdefault('key', 'value'))
    dd.update({'name': 'linda'})
    print(dd)

# 6.3 dict的子类

  • 不建议直接继承 c 语言实现的内置结构 dict,list

    class MyDict(dict):
        def __setitem__(self, key, value):
            super().__setitem__(key, value * 2)


    my_dict = MyDict(one=1)
    print(my_dict)  # 1, 某些情况下,不会调用重写的__setitem__
    my_dict['one'] = 1
    print(my_dict)  # 2, 触发重写的 __setitem__
  • 可继承 UserDict 实现自定义
  • python 语法模拟 c 语言实现细节
    from collections import UserDict

    # python 语法模拟 c 语言实现细节
    class CustomDict(UserDict):
        def __setitem__(self, key, value):
            super().__setitem__(key, value * 2)


    dd = CustomDict(one=1)
    print(dd)


    d1 = UserDict({'kk': 'vv'}, k1='v1')
    print(d1)
  • defaultdict 实现 missing

    from collections import defaultdict

    d2 = defaultdict(list)
    # 实现了 __missing__ 魔法函数,可参考UserDict __getitem__ 实现
    value = d2['key']
    print(value)
    print(dict(d2))

# 6.4 set和frozenset


    # set 不重复、无序
    s1 = set('abcc')
    print(s1)   # {'a', 'c', 'b'}

    # frozenset 不可变可以作为 dict key
    f1 = frozenset('abcc')
    print(f1)
上次更新: 8/26/2022, 2:06:10 PM