Получить первый элемент из вложенного списка в glom

      from glom import glom, T

target = {
    "items": [
                {
                    "label": "valuation",
                    "value": [
                        "900 USD"
                    ]
                },]
}
spec = ('items',[T['value'][0]])
r = glom(target,spec)
print(r)

Приведенный выше код возвращает список, ['900 USD']но я хотел бы просто получить содержимое этого списка, то есть первый элемент в списке «значение». В этом случае результат должен быть просто

Часть 2

      from glom import glom, T, Check, SKIP

target = {
    "items": [
                {
                    "label": "valuation",
                    "value": [
                        "900 USD"
                    ]
                },
                {
                    "label": "other_info",
                    "value": [
                        "700 USD"
                    ]
                },]
}
spec = ({
    'answer': ('items', [Check('label', equal_to='valuation', default=SKIP)],([T['value'][0]]))
})
r = glom(target,spec)
print(r)

Приведенный выше код приводит к {'answer': ['900 USD'] но мне нужно просто вернуться 900 USD.
Пытался добавить [0]в конце скобок, но это не сработало.
Играя с T тип также не привел к тому, что я ищу

2 ответа

Я решил это, перебирая список результатов и выбирая первый элемент.
Следующая спецификация работала

      spec = ({
    'answer': ('items', [Check('label', equal_to='valuation', default=SKIP)],( [T['value'][0]] ,Iter().first()) )
})

Обратите внимание на Iter().first() добавлен вызов функции.

      spec = {
    'answer': ('items', Iter().filter(
        lambda x: x['label'] is 'valuation'
    ).map('value.0').first())
}

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

Спецификация строки -- здесь 'value.0', аргумент в пользу mapметод -- понимает индексацию в глубокие списки.

В зависимости от конкретной желаемой логики это также может работать:

      spec = {
    'answer': ('items', Iter().first(
        lambda x: x['label'] is 'valuation'
    ), 'value.0')
}

Здесь мы объединили логику фильтрации с ограничением одного результата.

Другие вопросы по тегам