如何根据列表索引过滤 glom 中的列表?
How do I filter a list in glom based on list index?
我希望能够使用 glom 仅过滤掉 1 个或小于特定索引的所有列表项,但 glom 文档的片段部分中的过滤器片段没有告诉我如何做到这一点.
示例(仅保留列表中的前 2 项):
target = [5, 7, 9]
some_glom_spec = "???"
out = glom(target, some_glom_spec)
assert out == [5, 7]
到目前为止我发现的唯一方法是枚举传入目标,转换为列表,然后像这样 snippet:
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)
好问题!您在 中采用的方法有效,并且您在 enumerate
的正确路径上(这是使用索引迭代的 Pythonic 方式),但它可能更 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 的第三次调用将 return glom 的 STOP
并且 glom 将停止在列表上迭代。
您可以在 [=18] 中阅读更多关于 STOP
(相当于 break
的 glom 单例)及其伙伴 SKIP
(相当于 continue
) =].
我希望能够使用 glom 仅过滤掉 1 个或小于特定索引的所有列表项,但 glom 文档的片段部分中的过滤器片段没有告诉我如何做到这一点.
示例(仅保留列表中的前 2 项):
target = [5, 7, 9]
some_glom_spec = "???"
out = glom(target, some_glom_spec)
assert out == [5, 7]
到目前为止我发现的唯一方法是枚举传入目标,转换为列表,然后像这样 snippet:
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)
好问题!您在 enumerate
的正确路径上(这是使用索引迭代的 Pythonic 方式),但它可能更 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 的第三次调用将 return glom 的 STOP
并且 glom 将停止在列表上迭代。
您可以在 [=18] 中阅读更多关于 STOP
(相当于 break
的 glom 单例)及其伙伴 SKIP
(相当于 continue
) =].