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))