在Clojure中循环数组的惯用方法

时间:2014-07-23 22:00:57

标签: python clojure

我是clojure的新手,还有一些我如何找到简单的数组操作,这些操作在python中很容易在clojure中完成。例如,在clojure中执行此操作的惯用方法是什么?

for i = 1 to len(arr)-1:
  sum[i] = arr[i-1] + i

2 个答案:

答案 0 :(得分:5)

Clojure有一套很好的sequence manipulation函数,这些函数通常对这些常见任务很有帮助。这个例子是(map-indexed + arr)

user> (def arr [1 2 38 2 3 9 4 2])
#'user/arr
user> (map-indexed + arr)
(1 3 40 5 7 14 10 9)

虽然这只是因为您选择的具体示例。更一般的答案是使用mapmapvreducereductionsfor来做这类事情。例如:

user> (for [i (range 0 (count arr))] (+ i (arr i)))
(1 3 40 5 7 14 10 9)

答案 1 :(得分:0)

首先,让我们在Python中执行@ArthurUlfeldt's example

arr = [1, 2, 38, 2, 3, 9, 4, 2]

,并说,

sum = [None, None, None, None, None, None, None, None]

执行(更正/更新?)Python

for i in range(1, len(arr)):
   sum[i] = arr[i-1] + i

...给我们

sum
;[None, 2, 4, 41, 6, 8, 15, 11]

要将其转换为Clojure,请将Python索引替换为1,并给出

for i in range(len(arr) - 1):
   sum[i+1] = arr[i] + (i+1)

现在我们可以将右侧构建为

(map + (butlast arr) (iterate inc 1))
;(2 4 41 6 8 15 11)

...我们转换为向量,从索引1开始:

(vec (cons nil (map + (butlast arr) (iterate inc 1))))
;[nil 2 4 41 6 8 15 11]

我们可能希望以let形式绑定此

(let [sum (vec (cons nil (map + (butlast arr) (iterate inc 1))))]
  #_( ... use `sum` here))