удалить вложенные ключи из словаря - PullRequest
0 голосов
/ 07 декабря 2018

Итак, у меня есть следующий словарь:

{
    'assignees': {
        'arrayValue': {
            'values': [{
                'stringValue':

                    '56ea94b3d517f047c9d680a7'
            }]
        }
    },
    'assigneesMap': {
        'mapValue': {
            'fields': {
                '56ea94b3d517f047c9d680a7': {
                    'booleanValue': True
                }
            }
        }
    },
    'closed': {
        'booleanValue': False
    },
    'color': {
        'stringValue': '#ebbdf9'
    },
    'createdDate': {
        'timestampValue': '2018-12-07T06:11:40.058Z'
    },
    'creator': {
        'stringValue': '56ea94b3d517f047c9d680a7'
    },
    'deleted': {
        'booleanValue': False
    },
    'endDate': {
        'nullValue': None
    },
    'lastUpdated': {
        'timestampValue': '2018-12-07T06:11:40.058Z'
    },
    'name': {
        'stringValue': 'Test Checklist Tasks'
    },
    'priority': {
        'integerValue': '1'
    },
    'projectId': {
        'stringValue': 'M919Bcgv0h4J76VdQHYX'
    },
    'status': {
        'stringValue': 'created'
    },
    'tags': {
        'arrayValue': {}
    },
    'users': {
        'arrayValue': {
            'values': [{
                'stringValue': '56ea94b3d517f047c9d680a7'
            }]
        }
    },
    'usersRole': {
        'arrayValue': {
            'values': [{
                'mapValue': {
                    'fields': {
                        'role': {
                            'stringValue': 'admin'
                        },
                        'userId': {
                            'stringValue': '56ea94b3d517f047c9d680a7'
                        }
                    }
                }
            }]
        }
    }
}

Мне нужно удалить ненужные ключи (информацию о типе), чтобы получить следующий результат:

{
    'assignees': ['56ea94b3d517f047c9d680a7'],
    'assigneesMap': {'56ea94b3d517f047c9d680a7': True},
    'closed': False,
    'color': '#ebbdf9',
    'createdDate': '2018-12-07T06:11:40.058Z',
    'creator': '56ea94b3d517f047c9d680a7',
    'deleted': False,
    'endDate': None,
    'lastUpdate': '2018-12-07T06:11:40.058Z',
    'name': 'Test Checklist Tasks',
    'priority': 1,
    'projectId': 'M919Bcgv0h4J76VdQHYX',
    'status': 'created',
    'tags': [],
    'users': ['56ea94b3d517f047c9d680a7'],
    'usersRole': [{'role': 'admin', 'userId': '56ea94b3d517f047c9d680a7'}]
}

Один способ, которым я могПодумайте, чтобы решить эту проблему, чтобы сохранить отображение имени поля и типа поля и действовать соответственно.

{
    'assignees': 'array_of_strings',
    'assigneesMap': 'map',
    'closed': 'boolean',
    .....
}

Есть ли лучший способ сделать это без использования какой-либо такой конфигурации?Может быть, использовать рекурсию?

1 Ответ

0 голосов
/ 07 декабря 2018

Это определенно возможно с рекурсией, поскольку она следует шаблону в структуре данных и превосходит необходимость поля отображения, которое может стать неправильным, если будут введены дополнительные элементы.

Здесь приведен фрагмент кода для обработки раздела arrayValue, который может быть улучшен для остальных.

def parseValue(t):
    t2 = ''
    for k in t.keys():
        v = t[k]
        if k == 'arrayValue':
            t2 = parseValue(v)
        elif k == 'values':
            t2 = []
            for k2 in v:
                t2.append(parseValue(k2))
        elif k == 'stringValue':
            t2 = v
    return t2


e = {}
for k, v in input.iteritems():
    e[k] = parseValue(v)
print e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...