Упрощение словаря в python из события запуска Firestore - PullRequest
0 голосов
/ 10 февраля 2019

Я читаю данные из триггера обновлений Cloud Firestore.event - это словарь, содержащий данные в ключе ['value']['fields'].Однако каждый из ключей содержит вложенный словарь, содержащий ключ типа 'integerValue', 'booleanValue' или 'stringValue', где значение integerValue фактически является строкой.Есть ли способ удалить «указатели типа»?

Как мне преобразовать это:

{
    'fields': {
        'count': {
            'integerValue': '0'
        },
        'verified': {
            'booleanValue': False
        },
        'user': {
            'stringValue': 'Matt'
        }
    }
}

В это:

{
    'count': 0,
    'verified': False,
    'user': 'Matt',
}

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Использовать ключи () в словаре

origin_dict={
    'fields': {
        'count': {
            'integerValue': '0'
        },
        'verified': {
            'booleanValue': False
        },
        'user': {
            'stringValue': 'Matt'
        }
    }
}
# remove first layer
b = origin_dict['fields']
new_dict = dict()

for i in b.keys():
    # i will be second layer of dictionary
    for j in b[i].keys():
        # j will be third layer of dictionary
        new_dict[i] = b[i][j]
print (new_dict)
0 голосов
/ 10 февраля 2019

Вы можете создать отображение известных типов и преобразовать значения следующим образом:

types = {
    'integerValue': int,
    'booleanValue': bool,
    'stringValue': str,
}

Вы можете заменить вложенный словарь, как тот, который у вас есть, с помощью магии dict.popitem:

replacement = {}
for key, meta in event['value']['fields'].items():
    typ, value = meta.popitem()
    replacement[key] = types[typ](value)
event['value'] = replacement

Вы можете уменьшить его до одной строки со значением словаря:

event['value'] = {k: types[t](v) for k t, v in (k, *d.popitem()) for k, d in event['value']['fields'].items())}
0 голосов
/ 10 февраля 2019

Нет явного метода для этого.Один из способов, который вы можете сделать, - это перебирать существующий словарь, подбирая нужные вам элементы в новом словаре:

d = {
    'fields': {
        'count': {
            'integerValue': '0'
        },
        'verified': {
            'booleanValue': False
        },
        'user': {
            'stringValue': 'Matt'
        }
    }
}

required = ['count', 'verified', 'user']
d1 = {}
for x in d.values():
    for y in required:
        if 'integerValue' in x[y].keys():
            d1[y] = int(list(x[y].values())[0])
        else:
            d1[y] = list(x[y].values())[0]

print(d1)
# {'count': 0, 'verified': False, 'user': 'Matt'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...