Как мне отфильтровать список в 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)
Другие вопросы по тегам