如何根据列表索引过滤 glom 中的列表?



我希望能够过滤掉 1 个,或者可能所有列表项都小于某个 glom 索引,但 glom 文档代码段部分中的过滤器片段没有告诉我如何做到这一点。

示例(仅保留列表中的前 2 项(:

target = [5, 7, 9]
some_glom_spec = "???"
out = glom(target, some_glom_spec)
assert out == [5, 7]

好问题!你在答案中得到的方法有效,并且你走在正确的道路上enumerate(这是 Python 迭代索引的方式(,但它可能更 glom-y(也更有效率!这是我的做法:

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]

lambda 的第三次调用将返回 glom 的STOP,glom 将停止对列表进行迭代。

您可以在 glom API 文档中阅读有关STOP(相当于break的 glom singleton(及其合作伙伴SKIP(相当于continue(的更多信息。

到目前为止,我发现这样做的唯一方法是枚举传入目标,转换为列表,然后有一个类似于以下代码片段的 lambda:

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)

最新更新