clojure映射对的序列

时间:2012-10-09 18:58:47

标签: clojure

 (def tmp = [ 1 2 3 9 4 8])

我尝试创建2对,然后为每对,从第一个数字中减去第二个数字。 期望的结果:(1 6 4)

以下是我的尝试:

(map #(apply - %2 %1) (partition 2 tmp))

我该怎么做?

3 个答案:

答案 0 :(得分:10)

分区会生成一系列序列,因此映射它们的函数需要预期两个项目的序列。有几种表达方式:

(def tmp  [ 1 2 3 9 4 8])

user> (map #(- (second %) (first %)) (partition-all 2 tmp ))
(1 6 4)

user> (map #(apply - (reverse %)) (partition-all 2 tmp ))
(1 6 4)

user> (map (fn [[small large]] (- large small)) (partition-all 2 tmp ))
(1 6 4)

使用apply的版本是不同的,因为它仍然可以在奇数长度列表上“工作”:

user> (map #(apply - (reverse %)) (partition-all 2 [1 2 3 4 5 6 7] ))
(1 1 1 -7)

其他人会因无效输入而崩溃。

答案 1 :(得分:2)

以下是使用reduce

的解决方案
(reduce #(conj %1 (apply - (reverse %2)))  [] (partition-all 2 [1 2 3 9 4 8])) 
=> [1 6 4]

答案 2 :(得分:0)

我想知道为什么这个解决方案被忽视了......

由于切换减法的顺序只是原始减法的负数,(a-b = - (b-a)), 解决方案变得更有效率(仅在这种特殊情况下!!)

(map #(- (apply - %)) (partition-all 2 [1 2 3 9 4 8]))

教学方面,亚瑟的解决方案是正确的。这只是一个更适合特定问题的解决方案。