如何在Clojure中比较两个列表的元素

6
我想在Clojure中比较两个列表,
(def a '(1 2 3 4 5))
(def b '(3 2 7 8 10))

通过比较两个列表的元素,生成结果 (2 3) 或 (3 2)。

(defn compareList[x, y]
  (do
   (def result '())
   (def i 0)
   (def j 0)
   (while (< i 5) 
     (while (< j 5)
       (if (= (nth x i) (nth y j)) 
         (def result (conj (nth x i) result)))
       (def j (inc j))
     )
   )
   result))


(print (compareList a b))

这是我的代码,但结果是()。我哪里出错了?请帮忙。

你想要两个列表中都存在的元素吗? - cfrick
是的!!!创建一个新列表,其中包含两个列表中都存在的元素。 - Sunok Jang
2
为什么不直接求两个集合的交集呢? - cfrick
记住集合是序列中的一种,通常你只需要它作为列表。你也可以在集合上使用“cons”:(cons 3 #{1 2})的值为(3 1 2) - Thumbnail
3个回答

7
使用集合会更适合您的情况。
(clojure.set/intersection #{1 2 3 4 5} #{3 2 7 8 10})

那将输出#{2 3}

我怎么才能懒惰地完成它呢?例如,我的输入是(def a'(1 2 3 4 5)) (def b(range)) - Wei

1
这似乎是一个列表推导式(使用for宏返回LazySeq):
(for [a '(1 2 3 4 5) b '(3 2 7 8 10)
  :when
  (= a b)]
  a)

;; => (2 3)

0

我同意@turingcomplete的答案。一个集合仅包含不同的元素。

你可以通过以下方式看到:

user=> (set '(1 1 2 3 2 4 5 5))
#{1 2 3 4 5}

所以我认为你应该接受他的答案是正确的。


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