【发布时间】:2014-06-06 09:44:37
【问题描述】:
Clojure 库是否有“drop-every”类型函数?采用惰性列表并返回每个删除第 n 个项目的列表?
不知道怎么做。
干杯
菲尔
【问题讨论】:
标签: clojure functional-programming lazy-evaluation
Clojure 库是否有“drop-every”类型函数?采用惰性列表并返回每个删除第 n 个项目的列表?
不知道怎么做。
干杯
菲尔
【问题讨论】:
标签: clojure functional-programming lazy-evaluation
如果输入列表长度是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)
【讨论】:
(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 项的函数很容易编写。)
【讨论】: