Получить первый элемент из вложенного списка в 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')
}
Здесь мы объединили логику фильтрации с ограничением одного результата.