2014-12-03 71 views
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) 

我很好奇,如果有一個更短的成語更有效地已經做了這個,也許。

回答

5

是的,這是一個有關填充序列的分區的慣用方法。其實代碼非常相似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) 
+1

嗯,(第一(分區NN(重複墊)科爾))居然是:您還可以與期望懶序列,如果有指定長度的前期不起作用的其他功能使用稍微更冗長,我懷疑它表現更好。它必須首先解開包裝才能解包。我希望有一些非常簡單的事情,比如如果有一個可選的第三個墊參數:(取5(範圍10)無)=>(0 1 2 3 4無無無無無)哦。 – Jegschemesch 2014-12-03 13:12:19

0

這裏是一個懶惰的版本填充功能:

(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))