• python 数据结构之字典


    python 常见的数据结构之一就是字典,关于遍历,插入,删除。常见的比如使用items(),update,pop等。索引的时候使用keys()。

    >>> dic = dict(key='value')
    >>> dic
    {'key': 'value'}
    >>> dic['key']
    'value'
    >>> dic.get('key')
    'value'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    过去的用法大都是使用[‘key’]或者get的形式去访问,因为get对于不存在的key可以返回None,但是如果一个字典不存在一个key使用[‘key’]则会提示key错误的问题.因此如果要使用传统的方法去范围字典,建议使用dict.get(‘key’)的形式

    >>> dic['name']
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    KeyError: 'name'
    >>> dic.get('name')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    那如果能使用对象.属性的方式去访问,便可以大大简化访问的繁文缛节了。下面介绍一下字典操作和访问的一个库much

    1.环境安装

    python -m pip install munch
    
    
    • 1
    • 2

    2.范例使用

    使用instance判断实例类型和字典访问

    from munch import Munch
    
    dicMu = Munch()
    print(isinstance(dicMu , dict))
    
    dicMu .key = 'value'
    print(f'输出dic["key"]形式: {dicMu ["key"]}')
    print(f'输出dic.get("key")形式: {dicMu .get("key")}')
    print(f'输出dic.key形式: {dicMu .key}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出如下:

    True
    输出dic["key"]形式: value
    输出dic.get("key")形式: value
    输出dic.key形式: value
    
    • 1
    • 2
    • 3
    • 4

    因为Munch类继承于dict,因此子类Munch适用于父类dict对字典的常规操作。涉及增删改查都可以使用

    from munch import Munch
    
    dicMu = Munch()
    dicMu.name = 'zhiyu'
    dicMu['age'] = 'NN'
    print(f'原始字典: {dicMu}')
    
    # 增加元素
    dicMu['gender'] = 'big man'
    dicMu.name2 = 'zhiyu2'
    print(f'字典插入数据: {dicMu}')
    
    # 修改元素
    dicMu['gender'] = 'modifyMan'
    dicMu.name2 = 'modifyName'
    print(f'字典修改数据: {dicMu}')
    
    # 删除元素
    dicMu.pop('gender')
    print(f'字典删除数据: {dicMu}')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    输出为:

    原始字典: Munch({'name': 'zhiyu', 'age': 'NN'})
    字典插入数据: Munch({'name': 'zhiyu', 'age': 'NN', 'gender': 'big man', 'name2': 'zhiyu2'})
    字典修改数据: Munch({'name': 'zhiyu', 'age': 'NN', 'gender': 'modifyMan', 'name2': 'modifyName'})
    字典删除数据: Munch({'name': 'zhiyu', 'age': 'NN', 'name2': 'modifyName'})
    
    • 1
    • 2
    • 3
    • 4

    当然删除数据还可以使用

    del dicMu['name2']
    del dicMu.name2
    
    • 1
    • 2

    另外对于字典的一些其他方法也是适用的,比如遍历方法dicMu.items(),dicMu.keys(),dicMu.vaules(),dicMu.setdefault(‘gender’, ‘male’)等也同样适用。

    3. 设置默认值

    from munch import Munch
    
    dicMu = Munch()
    dicMu.name = 'zhiyu'
    dicMu['age'] = 'NN'
    print(f'原始字典: {dicMu}')
    
    print(dicMu.get('gender'))
    print(dicMu.get('gender'), 'none data')
    dicMu.setdefault('gender', 'male')
    print(dicMu.get('gender'))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    还有一种方法就是使用Munch中的DefaultMunch,功能类似setdefault在访问不存在的key时,返回一个指定的默认值。且可以指定多个数据的默认值,而不用像使用get一样,每个都设置一下,或者使用setdefault进行设置

    from munch import DefaultMunch
    
    dicMu = DefaultMunch('undefined', {'name':'zhiyu'})
    print(dicMu)
    print(dicMu.age)
    print(dicMu.gender)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出为:

    DefaultMunch('undefined', {'name': 'zhiyu'})
    undefined
    undefined
    
    • 1
    • 2
    • 3

    上面这个是访问不存在的key时,返回给指定的提示不存在数据,如没有age,访问age时提示undefined。还有一种情况是如果没有这个key,则给字典新增一个key值。即访问Munch对象不存在的key时,自动触发给Munch对象新增一个key并且为其设置一个默认值,这个时候需要使用到DefaultFactoryMunch函数。

    from munch import DefaultFactoryMunch
    
    dicMu1 = DefaultFactoryMunch(list, {'name':'zhiyu'})
    print(dicMu1.age)
    dicMu2 = DefaultFactoryMunch(dict, {'name':'zhiyu'})
    print(dicMu2.age)
    dicMu3 = DefaultFactoryMunch(tuple, {'name':'zhiyu'})
    print(dicMu3.age)
    print(dicMu3)
    dicMu3.age = 'NN'
    print(dicMu3)
    dicMu4 = DefaultFactoryMunch('undefined', {'name':'zhiyu'})
    DefaultFactoryMunch(tuple, {'name': 'zhiyu', 'age': 'NN'})
    print(dicMu4.age)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出如下:

    []
    {}
    Traceback (most recent call last):
    DefaultFactoryMunch(tuple, {'name': 'zhiyu', 'age': ()})
      File "D:\python37\lib\site-packages\munch\__init__.py", line 103, in __getattr__
        return object.__getattribute__(self, k)
    AttributeError: 'DefaultFactoryMunch' object has no attribute 'age'
       self[k] = self.default_factory()
    TypeError: 'str' object is not callable
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    发现如果使用DefaultFactoryMunch则不能使用 not callable对象。

    4. 序列化支持

    Munch支持系列化为Json或者yaml格式的字符串转换成Json对象。

    from munch import Munch
    import json
    import yaml
    
    
    munch_obj = Munch(foo=Munch(lol=True), bar=100, msg='hello')
    print(json.dumps(munch_obj))
    
    munch_obj = Munch(foo=Munch(lol=True), bar=100, msg='hello')
    print(yaml.dump(munch_obj))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    创建一个普通的vue项目
    134.如何进行实时计算
    SpringMVC拦截器
    C# void 关键字学习
    IDM安装教程
    计算机毕设(附源码)JAVA-SSM楼盘销售管理系统
    无人机航测拍摄分类和注意事项
    HDU 2089 不要62(数位DP,DFS写法)
    上门预约服务类的App功能详解
    一些c语言零碎小知识
  • 原文地址:https://blog.csdn.net/rhx_qiuzhi/article/details/125568496