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