gpt4 book ai didi

clojure - 在 clojure 列表中转发填充 nil 值的更好方法

转载 作者:行者123 更新时间:2023-12-02 06:26:46 25 4
gpt4 key购买 nike

我写了一个函数来转发给定列表中的填充 nil 值。该函数按预期工作,但我想知道在 clojure 中是否有更好的(阅读更多地道的)方法来实现这一点。

前向填充 nil 值的意思是:将最后一个非 nil 元素向前传播到下一个非 nil 元素。

函数

(defn ffill [mylist first-value last-value]
(let [mylist-0 (concat (list first-value) mylist)
mylist-N (concat mylist-0 (list (dec (count mylist-0))))
mylist-idx (map-indexed (fn [i val] (if (not (nil? val)) i nil)) mylist-N)
mylist-idx-no-nils (filter #(->> % (nil?) (not)) mylist-idx)
ffidx (flatten (map #(repeat (- %2 %1) %1) mylist-idx-no-nils (next mylist-idx-no-nils)))]
(map #(nth mylist-N %) (next ffidx))
))

示例

(ffill '(nil nil nil "a" "b" "c" nil "d" nil) "a" "d")
("a" "a" "a" "a" "b" "c" "c" "d" "d")

(ffill '("z" nil nil "a" "b" "c" nil "d" nil) "a" "d")
("z" "z" "z" "a" "b" "c" "c" "d" "d")

(ffill '("z" nil nil "a" "b" "c" nil "e") "a" "d")
("z" "z" "z" "a" "b" "c" "c" "e")

(ffill '(0 nil nil nil 4 5 nil nil 8 nil) 0 8)
(0 0 0 0 4 5 5 5 8 8)

(ffill '(0 nil nil nil 4 5 nil nil 8) 0 8)
(0 0 0 0 4 5 5 5 8)

(ffill '(nil nil nil nil 4 5 nil nil 8 nil) 0 8)
(0 0 0 0 4 5 5 5 8 8)

最佳答案

据我所知,您函数的最后一个参数未使用。鉴于此,以下内容应该有效。如果我对参数有任何误解,请告诉我。

(defn propagate-non-nil-values [s begin]
(when (seq s)
(if (nil? (first s))
(cons begin (propagate-non-nil-values (rest s) begin))
(cons (first s) (propagate-non-nil-values (rest s) (first s))))))

关于clojure - 在 clojure 列表中转发填充 nil 值的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58726792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com