【问题标题】:How do I filter a list in glom based on list index?如何根据列表索引过滤glom中的列表?
【发布时间】:2019-08-16 09:14:04
【问题描述】:

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

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

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

out = glom(target, some_glom_spec)

assert out == [5, 7]

【问题讨论】:

    标签: python glom


    【解决方案1】:

    好问题!您在your answer 中采用的方法有效,并且您使用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 的STOP,并且glom 将停止在列表上迭代。

    您可以在the glom API docs here 中阅读有关STOP(相当于break 的glom 单例)及其合作伙伴SKIP(相当于continue)的更多信息。

    【讨论】:

      【解决方案2】:

      到目前为止,我发现这样做的唯一方法是枚举传入的目标,转换为一个列表,然后有一个像 snippet 这样的 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多