首页 > 解决方案 > 使用值匹配条件转换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'} ]}}

元组到字符串的转换是相当好的。需要帮助识别与上述条件匹配的嵌套键并就地进行转换

标签: pythondictionary

解决方案


以下作品

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'}]}}

推荐阅读