我在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))
答案 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
,其中包含arg1
和arg2
中的每组值,正是您在这里寻找的内容。更直接的翻译可能如下:
(doseq [i (range (count a))]
(do-something (nth a i) (nth b i)))
...但是不要使用它; count
和nth
都可能变慢或不可用,这取决于所使用的特定集合类型。
答案 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
形式将绑定写到y
和let
上,但是随后它像在mapv
中一样在本地“变量”上运行。 / p>