除了谓词为真的集合的最后元素之外的所有元素的序列

glt*_*lts 0 clojure

我在写一个优雅drop-last-bybutlast-by功能时遇到了麻烦.

(drop-last-by odd? [2 1 9 4 7 7 3])  ; => (2 1 9 4)
(drop-last-by odd? [2 4])  ; => (2 4)
(drop-last-by odd? [9])  ; => ()
Run Code Online (Sandbox Code Playgroud)

到目前为止我的工作但看起来有点笨拙,我想知道它是否可以在两三行中完成.

(defn drop-last-by [pred coll]
  (let [p (partition-by pred coll)]
    (apply concat (if (and (seq p) (pred (first (last p))))
                    (butlast p)
                    p))))
Run Code Online (Sandbox Code Playgroud)

Sam*_*tep 5

既然drop-while已经基本上完成了你所需要的,而且由于你当前的解决方案已经不是很懒,我写的drop-last-by是这样的:

(defn drop-last-by [pred coll]
  (reverse (drop-while pred (reverse coll))))
Run Code Online (Sandbox Code Playgroud)