将函数映射到序列中的每个第 n 个元素的巧妙方法是什么?之类的东西(map-every-nth fn coll n)
,这样它就会返回只有每第 n 个元素转换的原始序列,例如 (map-every-nth inc (range 16) 4) 将返回 (0 1 2 4 4 5 6 8 8 9 10 12 12 13 14 16)
问问题
2814 次
3 回答
12
试试这个:
(defn map-every-nth [f coll n]
(map-indexed #(if (zero? (mod (inc %1) n)) (f %2) %2) coll))
(map-every-nth inc (range 16) 4)
> (0 1 2 4 4 5 6 8 8 9 10 12 12 13 14 16)
于 2012-04-26T02:23:09.167 回答
1
我建议这比公认的答案更简单、更干净:
(defn map-every-nth [f coll n]
(map f (take-nth n coll)))
这是一个方便的知道:http ://clojuredocs.org/clojure_core/clojure.core/take-nth
于 2012-07-27T03:06:38.883 回答
0
我个人更喜欢这个解决方案:
(defn apply-to-last [f col] (concat (butlast col) (list (f (last col)))))
(apply concat (map #(apply-to-last (fn [x] (* 2 x)) %) (partition 4 (range 16))))
或者作为一个函数:
(defn apply-to-last [f col] (concat (butlast col) (list (f (last col)))))
(defn map-every-nth [f col n] (apply concat (map #(apply-to-last f %) (partition n col))))
(map-every-nth (fn [x] (* 2 (inc x))) (range 16) 4)
; output: (0 1 2 8 4 5 6 16 8 9 10 24 12 13 14 32)
apply-to-first
请注意,这很容易导致能够控制映射每个第 n 个元素的“开始” apply-to-second
。apply-to-third
我不知道我上面写的代码的性能,但它对我来说似乎更惯用。
于 2015-09-17T13:54:36.217 回答