Как мне отфильтровать список в glom на основе индекса списка?
Я хочу иметь возможность отфильтровать только 1 или, возможно, все элементы списка меньше определенного индекса с помощью glom, но фрагменты фильтра в разделе фрагментов документации glom не показывают мне, как это сделать.
Пример (оставьте только 2 первых элемента в списке):
target = [5, 7, 9]
some_glom_spec = "???"
out = glom(target, some_glom_spec)
assert out == [5, 7]
2 ответа
Хороший вопрос! Подход, который вы использовали в своем ответе, работает, и вы на правильном пути сenumerate
(это питонический способ итерации с индексом), но он мог бы быть более приятным (и более эффективным!). Вот как я это делаю:
from glom import glom, STOP
target = [1, 3, 5, 7, 9]
spec = (enumerate, [lambda item: item[1] if item[0] < 2 else STOP])
glom(target, spec)
# [1, 3]
Третий вызов лямбды вернет glom's STOP
и glom перестанет повторяться в списке.
Вы можете узнать больше о STOP
(синглтон glom эквивалентен break
) и его партнер SKIP
(эквивалент continue
) в документации по API glom здесь.
Единственный способ, который я нашел до сих пор, - это перечислить входящую цель, преобразовать ее в список, а затем получить лямбду, как в этом фрагменте:
target = [5, 7, 9]
some_glom_spec = (enumerate, list, (lambda t: [i[1] for i in t if i[0] < 2]))
out = glom(target, some_glom_spec)