преобразовать значение всех ключей в dict с условием соответствия значения - PullRequest
0 голосов
/ 31 марта 2020

Учитывая данные, подобные приведенным ниже

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

Преобразование кортежа к строке вполне нормально. Требуется помощь в определении вложенных ключей, соответствующих указанному выше условию, и выполнении преобразования на месте

1 Ответ

0 голосов
/ 01 апреля 2020

Работает ниже

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