6

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

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

target = [5, 7, 9]
some_glom_spec = "???"

out = glom(target, some_glom_spec)

assert out == [5, 7]
4

2 回答 2

6

好问题!您在答案中采用的方法有效,并且您走在正确的道路上enumerate(这是使用索引进行迭代的 Pythonic 方式),但它可能更格洛姆(更高效!)。这是我的做法:

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'sSTOP并且 glom 将停止在列表上迭代。

您可以在此处的 glom API 文档中阅读有关STOP(相当于 的 glom 单例break)及其伙伴SKIP(相当于continue)的更多信息。

于 2019-08-19T21:24:59.777 回答
1

到目前为止,我发现这样做的唯一方法是枚举传入的目标,转换为一个列表,然后在这个片段中使用一个 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)
于 2019-08-16T09:14:04.007 回答