python 常见的数据结构之一就是字典,关于遍历,插入,删除。常见的比如使用items(),update,pop等。索引的时候使用keys()。
>>> dic = dict(key='value')
>>> dic
{'key': 'value'}
>>> dic['key']
'value'
>>> dic.get('key')
'value'
过去的用法大都是使用[‘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')
那如果能使用对象.属性的方式去访问,便可以大大简化访问的繁文缛节了。下面介绍一下字典操作和访问的一个库much
python -m pip install munch
使用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}')
输出如下:
True
输出dic["key"]形式: value
输出dic.get("key")形式: value
输出dic.key形式: value
因为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}')
输出为:
原始字典: 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'})
当然删除数据还可以使用
del dicMu['name2']
del dicMu.name2
另外对于字典的一些其他方法也是适用的,比如遍历方法dicMu.items(),dicMu.keys(),dicMu.vaules(),dicMu.setdefault(‘gender’, ‘male’)等也同样适用。
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'))
还有一种方法就是使用Munch中的DefaultMunch,功能类似setdefault在访问不存在的key时,返回一个指定的默认值。且可以指定多个数据的默认值,而不用像使用get一样,每个都设置一下,或者使用setdefault进行设置
from munch import DefaultMunch
dicMu = DefaultMunch('undefined', {'name':'zhiyu'})
print(dicMu)
print(dicMu.age)
print(dicMu.gender)
输出为:
DefaultMunch('undefined', {'name': 'zhiyu'})
undefined
undefined
上面这个是访问不存在的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)
输出如下:
[]
{}
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
发现如果使用DefaultFactoryMunch则不能使用 not callable对象。
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))