python中有一些强大的内置函数map,可以优雅的遍历列表。最近碰到了需要,遍历修改json的值需求,因此想到实现一个类似map的方法,可以方便灵活的对json或者json转的字典进行遍历操作。代码如下:
def dict_map(data_dict,func):
"""
遍历data_dict的每个一值, 每个元素执行函数func,更新每个value的值。
:param data_dict 要操作的字典。json.loads() 生成的字典,不支持集合和元组的元素操作
:param func 执行的函数 函数声明: def func(key,value)
data = {"a": 1, "b": [{"a": 1}, {"b": 2}, 3]}
def func(key,value):
# 对key 等于a 值转为str,其它的元素进行加1
if key == 'a':
return str(value)
else:
return value + 1
data = dict_map(data, func)
#将每个元素加10
data = dict_map(data, lambda k, v: v + 10)
#将每个元素转成字符串
data = dict_map(data, lambda k, v: str(v))
"""
tmp_dict = deepcopy(data_dict)
for item in data_dict:
tmp_value = data_dict.get(item)
# tmp_value 为list时 按索引遍历调用
if isinstance(tmp_value, list):
for i in range(len(tmp_value)):
if not isinstance(tmp_value[i], (list, dict)):
tmp_dict[item][i] = func(item, tmp_value[i])
else:
tmp_dict[item][i] = dict_map(tmp_value[i], func)
# 字典对象递归调用
elif isinstance(tmp_value, dict):
tmp_dict[item] = dict_map(tmp_value, func)
# 其它类型直接调用func函数
else:
tmp_dict[item] = func(item, tmp_dict[item])
return tmp_dict
网友评论