如何在锁步中迭代Clojure中两个不同列表中的项目?

时间:2019-07-09 11:13:45

标签: clojure

我在clojure a和b中有两个长度相同的列表。我想做以下


for i in range(len(a)):
    if a[i] == b[i]:
        do_something(a[i], b[i])

我尝试过但没有奏效的内容。 for不会遍历相应的元素,而是遍历所有可能的组合:


(for [i a j b] (do-something i j))

3 个答案:

答案 0 :(得分:2)

惯用等效词可能是:

(doall (map do-something a b))

...或者,作为扩展版本,您仍然可以编写自己的循环:

(doseq [[i j] (map vector a b)]
  (do-something i j))
  • 由于for很懒惰,因此除非有人正在消耗其结果,否则它实际上可能不会评估您的整个序列; doseq始终对所有内容调用do-something
  • map somefunc arg1 arg2调用somefunc,其中包含arg1arg2中的每组值,正是您在这里寻找的内容。

更直接的翻译可能如下:

(doseq [i (range (count a))]
  (do-something (nth a i) (nth b i)))

...但是不要使用它; countnth都可能变慢或不可用,这取决于所使用的特定集合类型。

答案 1 :(得分:1)

在循环中添加“ if”条件:

(doseq [[x y] (map vector a b)
        :when (= x y)]
 (do_something x y))

答案 2 :(得分:0)

如果您想使用便利功能,请执行以下操作的I already have one

(ns tst.demo.core
  (:use tupelo.test)
  (:require [tupelo.core :as t]))

  (let [xs [ 1  2  3]
        ys [10 20 30]]
    (is= [11 22 33]
      (t/map-let [x xs
                  y ys]
        (+ x y))))

因此,您像x形式将绑定写到ylet上,但是随后它像在mapv中一样在本地“变量”上运行。 / p>