我是clojure的新手,还有一些我如何找到简单的数组操作,这些操作在python中很容易在clojure中完成。例如,在clojure中执行此操作的惯用方法是什么?
for i = 1 to len(arr)-1:
sum[i] = arr[i-1] + i
答案 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)
虽然这只是因为您选择的具体示例。更一般的答案是使用map
,mapv
,reduce
或reductions
或for
来做这类事情。例如:
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))