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

私は 2 のペアを作成しようとしています。次に、各ペアについて、最初の数字から 2 番目の数字を引きます。望ましい結果: (1 6 4)

これが私が試していたものです:

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

これどうやってするの?

4

3 に答える 3

11

Partition はシーケンスのシーケンスを生成するため、それらにマップする関数は 2 つの項目のシーケンスを想定する必要があります。これを表現するにはいくつかの方法があります。

(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)

他のものは無効な入力でクラッシュしますが、これを好むかもしれません。

于 2012-10-09T19:04:39.870 に答える
2

これがを使用した解決策ですreduce

(reduce #(conj %1 (apply - (reverse %2)))  [] (partition-all 2 [1 2 3 9 4 8])) 
=> [1 6 4]
于 2012-10-09T20:06:56.950 に答える
0

なぜこの解決策が見落とされたのだろうか...

減算の順序を切り替えることは、単純に元の減算のマイナス (ab=-(ba)) であるため、解はより効率的になります (この特定の場合のみ!!)。

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

教育的には、アーサーの解決策は正しいです。これは、特定の質問により適したソリューションにすぎません。

于 2012-12-13T00:46:14.940 に答える