python - 使用值匹配条件转换dict中所有键的值
问题描述
给定一个像下面这样的字典
{'a': [{'id': 0, 'res': [0, 1]}, {'id': 1, 'res': [8, 9]}], 'b': [{'id': 26, 'f': ('f3', {'nrP': 1})}, {'if': 0, 'f': ('f1', {'init': 6, 'nrS': 14})}], 'c': ('setup', {}), 'd': ('setup', {'max': 'one', 'sim': 'true'}), 'e': [{'id': 8, 'period': ('sl160', 8), 'res': 23}], 'f': [2, 3], 'g': {'f0': 0, 'p0': [{'id': 1, 'Value': -1}], 'ref': [{'id': 0, 'rs': ('abc', 0)}]}}
需要具有值为 1 的所有键(包括嵌套键),其值为元组 & 2)在元组中恰好有 2 个元素,并且 3)这两个元素都是字符串或数字(不是 dict/list 或其他数据结构)转换为字符串tuple[0] + ":" + tuple[1]
。与上述数据匹配的示例键是 - 'period': ('sl160', 8)
&'rs': ('abc', 0)
对于上述示例,预期结果如下。
{'a': [{'id': 0, 'res': [0, 1]}, {'id': 1, 'res': [8, 9]}], 'b': [{'id': 26, 'f': ('f3', {'nrP': 1})}, {'if': 0, 'f': ('f1', {'init': 6, 'nrS': 14})}], 'c': ('setup', {}), 'd': ('setup', {'max': 'one', 'sim': 'true'}), 'e': [{'id': 8, 'period': 'sl160 : 8', 'res': 23}], 'f': [2, 3], 'g': {'f0': 0, 'p0': [{'id': 1, 'Value': -1}], 'ref': [{'id': 0, 'rs': 'abc : 0'} ]}}
元组到字符串的转换是相当好的。需要帮助识别与上述条件匹配的嵌套键并就地进行转换
解决方案
以下作品
def convertTwoElmStrTupleToStr(dictIe):
if isinstance(dictIe, dict):
# base case
for k, v in dictIe.items():
if isinstance(v, tuple) and len(v) == 2 and (isinstance(v[0], str) or isinstance(v[0], int)) and (isinstance(v[1], str) or isinstance(v[1], int)):
dictIe[k] = f'{v[0]} : {v[1]}'
elif isinstance(v, list):
for item in v:
if isinstance(item, dict):
# call base case on each dict
convertTwoElmStrTupleToStr(item)
elif isinstance(v, dict):
# call base case on each dict
convertTwoElmStrTupleToStr(v)
return dictIe
输出
>>> convertTwoElmStrTupleToStr(a)
{'a': [{'id': 0, 'res': [0, 1]}, {'id': 1, 'res': [8, 9]}], 'b': [{'id': 26, 'f': ('f3', {'nrP': 1})}, {'if': 0, 'f': ('f1', {'init': 6, 'nrS': 14})}], 'c': ('setup', {}), 'd': ('setup', {'max': 'one', 'sim': 'true'}), 'e': [{'id': 8, 'period': 'sl160 : 8', 'res': 23}], 'f': [2, 3], 'g': {'f0': 0, 'p0': [{'id': 1, 'Value': -1}], 'ref': [{'id': 0, 'rs': 'abc : 0'}]}}
推荐阅读
- perl - 如何在文件 IO 中使用正则表达式?
- c++ - 我如何分别获得 g++ 的编译、组装、预处理器和链接时间
- windows - 如何从现有的 WSL bash 窗口启动新的 WSL bash 窗口
- django - 如何动态使用 Django widthratio 标签?
- angular - 跨域请求被阻止,发布请求 Angular 和 Spring
- angularjs - 从角度数据表过滤后,空值不再显示
- android - 如何维护单个活动的 startActivityForResult
- elasticsearch - 我应该如何过滤使用 Serilog.Sink.Elasticsearch 创建的日志信息?
- c++ - 如何赋值默认值和变量语句赋值
- html - 使用Angular 6限制文本框中第一个位置的空间