Использование библиотеки glom с Python: преобразование результата списка в словарь с ключом, сгенерированным функцией Python

Я использую библиотеку Python glom для извлечения данных из словаря, содержащего списки.

Этот вопрос о том, как unterstanding тибрить работает с пользователем определенных функций, и как я могу перенести данные из списков в словарях в пределах переть.

В качестве примера я пытаюсь напрямую преобразовать данные в словарь.

# in the real world, this data has way many more fields
data = {'vessels': [{'aisStatic': {'mmsi': 1, 'name': 'name1'}},
               {'aisStatic': {'mmsi': 2, 'name': 'name2'}}],
       'timestamp': None}

# this is the glob spec to extract the data 
spec = ('vessels',[({'mmsi':'aisStatic.mmsi','name':'aisStatic.name'})])

# an example to generate a new key based on data & position
def keyfunc(i, v):
    return f"v{i}-{v['mmsi']}"

result = glom(data, spec)

wanted_result = {keyfunc(i,v): v for i, v in enumerate(result)}

Желаемый результат выглядит так

{'v0-1': {'mmsi': 1, 'name': 'name1'}, 'v1-2': {'mmsi': 2, 'name': 'name2'}}

Например, я использую понимание вне glom, чтобы получить желаемый результат, поскольку glom возвращает список.

Я ищу способ получить те же результаты напрямую через спецификацию glom.

1 ответ

Решение

Рабочее решение - использовать Invoke для функции перечисления.

from glom import merge, Invoke

data = {
    "vessels": [
        {"aisStatic": {"mmsi": 1, "name": "name1"}},
        {"aisStatic": {"mmsi": 2, "name": "name2"}},
    ],
    "timestamp": None,
}

spec = (
    "vessels",
    [{"mmsi": "aisStatic.mmsi", "name": "aisStatic.name"}],
    Invoke(enumerate).specs(T),
    [lambda x: {f"v{x[0]}-{x[1].get('mmsi')}": x[1]}],
    merge,
)

print(glom(data, spec))

который возвращает запрошенный результат

{'v0-1': {'mmsi': 1, 'name': 'name1'}, 'v1-2': {'mmsi': 2, 'name': 'name2'}}
Другие вопросы по тегам