【问题标题】:Clojure. Drop-every?克洛朱尔。滴-每个?
【发布时间】:2014-06-06 09:44:37
【问题描述】:

Clojure 库是否有“drop-every”类型函数?采用惰性列表并返回每个删除第 n 个项目的列表?

不知道怎么做。

干杯

菲尔

【问题讨论】:

    标签: clojure functional-programming lazy-evaluation


    【解决方案1】:

    如果输入列表长度是n 的倍数,您可以使用partition 函数:

    (defn drop-every [n lst] (apply concat (map butlast (partition n lst))))
    (take 5 (drop-every 3 (range)))
    ; (0 1 3 4 6)
    

    【讨论】:

      【解决方案2】:
      (defn drop-every [n xs]
        (lazy-seq
         (if (seq xs)
           (concat (take (dec n) xs)
                   (drop-every n (drop n xs))))))
      

      例子:

      (drop-every 2 [0 1 2 3 4 5])
      ;= (0 2 4)
      
      (drop-every 3 [0 1 2 3 4 5 6 7 8])
      ;= (0 1 3 4 6 7)
      

      作为旁注,drop-nth 将是一个诱人的名称,因为在 clojure.core 中已经有一个 take-nth。但是,take-nth 总是返回第一个项目,然后是之后的每个第 n 个项目,而上述版本的 drop-every 删除从原始序列的第 n 个项目开始的每个第 n 个项目。 (根据上述内容,删除第一项和第一项之后的每第 n 项的函数很容易编写。)

      【讨论】:

      • 啊...连接。我没有想到。那时我试图弄清楚如何从 xs 中获取“下一个项目”,而不仅仅是将它们粘在一起。谢谢。
      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多