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