首页 > 解决方案 > 在 clojure 中将函数映射到多项 coll 或 seqence 的好方法

问题描述

我目前正在学习 Clojure,并且正在尝试学习如何以最好的方式做事。今天我在看在序列上做事的基本概念,我知道了map、filter和reduce的基础知识。现在我想尝试对序列中的元素对做一些事情,我找到了两种方法。我应用的函数是 println。输出只是 12 34 56 7

(def xs [1 2 3 4 5 6 7])
(defn work_on_pairs [xs]
  (loop [data xs]
    (if (empty? data)
      data
      (do
        (println (str (first data) (second data)))
       (recur (drop 2 data))))))
(work_on_pairs xs)

我的意思是,我可以这样做

(map println (zipmap (take-nth 2 xs) (take-nth 2 (drop 1 xs))))
;; prints [1 2] [3 4] [5 6], and we loose the last element because zip.

但这不是很好。我的背景是 Python,我可以说zip(xs[::2], xs[1::2])但我想这不是 Clojure 的方式。因此,我正在寻找有关如何以最佳 Clojure 方式执行此操作的建议。

我意识到我对 Clojure 很陌生,我什至不知道这种操作叫什么。

感谢您的任何意见

标签: clojure

解决方案


这可以通过以下方式完成partition-all

(def xs [1 2 3 4 5 6 7])

(->> xs
     (partition-all 2)  ; Gives ((1 2) (3 4) (5 6) (7))
     (map (partial apply str))  ; or use (map #(apply str %))
     (apply println))

12 34 56 7

map行只是加入对,因此“()”不会出现在输出中。

如果您希望每对打印在自己的行上,请更改(apply println)(run! println). 您的预期输出似乎与您的代码不一致,因此尚不清楚。


推荐阅读