如何在Clojure中交换嵌套向量中所有成对元素?

3

假设我有这样的一个东西:

[[[[1 2] [3 4] [5 6]]] [[[7 8] [9 10]]] [[[2 4]]]]

我想交换最内层的匹配项以实现此目的。
[[[[2 1] [4 3] [6 5]]] [[[8 7] [10 9]]] [[[4 2]]]]

假设我在获取数据之前不知道深度,且所有的对都在同一深度级别上。那么有什么惯用的方法可以实现这个呢?

2
你是怎么遇到这个问题的?当你说“innermost”时,似乎你指的是所有情况。也许增加更多的测试用例会有所帮助?你目前尝试了什么? - jmargolisvt
1个回答

5

clojure.walk能帮你完成这项工作:

(require '[clojure.walk :as walk])

(defn pair? [s]
  (and (vector? s)
       (every? (complement vector?) s)
       (= (count s) 2)))

(defn swap-pairs [s]
  (walk/prewalk #(if (pair? %)
                   (vec (reverse %))
                   %)
                s))

您可能会提出不同的 pair? 谓词,以更好地适应您的领域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接