6
要墊出一些價值的序列,這是我想出來的:成語填充序列
(defn pad [n coll val]
(take n (concat coll (repeat val))))
(pad 10 [1 2 3] nil) ; (1 2 3 nil nil nil nil nil nil nil)
我很好奇,如果有一個更短的成語更有效地已經做了這個,也許。
要墊出一些價值的序列,這是我想出來的:成語填充序列
(defn pad [n coll val]
(take n (concat coll (repeat val))))
(pad 10 [1 2 3] nil) ; (1 2 3 nil nil nil nil nil nil nil)
我很好奇,如果有一個更短的成語更有效地已經做了這個,也許。
是的,這是一個有關填充序列的分區的慣用方法。其實代碼非常相似part of the partition function in clojure.core區別在於partition
不承擔單一的填充值,而是要求一個序列:
core.clj:
([n step pad coll]
(lazy-seq
...
(list (take n (concat p pad))))))))
你可以得到相同的結果通過經過一個填充集合分區:
user> (defn pad [n coll val]
(take n (concat coll (repeat val))))
#'user/pad
user> (pad 10 [1 2 3] nil)
(1 2 3 nil nil nil nil nil nil nil)
user> (first (partition 10 10 (repeat nil) [1 2 3]))
(1 2 3 nil nil nil nil nil nil nil)
這裏是一個懶惰的版本填充功能:
(defn lazy-pad
"Returns a lazy sequence which pads sequence with pad-value."
[sequence pad-value]
(if (empty? sequence)
(repeat pad-value)
(lazy-seq (cons (first sequence) (lazy-pad (rest sequence) pad-value)))))
你可以使用它像一個普通的無限延遲集合:
(take 5 (lazy-pad [1 2 3] :pad))
=> (1 2 3 :pad :pad)
IMO它更優雅的這種方式。
(partition 2 (interleave [1 2 3 4] (lazy-pad [:a] :pad)))
=> ((1 :a) (2 :pad) (3 :pad) (4 :pad))
嗯,(第一(分區NN(重複墊)科爾))居然是:您還可以與期望懶序列,如果有指定長度的前期不起作用的其他功能使用稍微更冗長,我懷疑它表現更好。它必須首先解開包裝才能解包。我希望有一些非常簡單的事情,比如如果有一個可選的第三個墊參數:(取5(範圍10)無)=>(0 1 2 3 4無無無無無)哦。 – Jegschemesch 2014-12-03 13:12:19