2014-10-19 52 views
0

我想要採取一些輸入,對其運行計算,然後找到最小值,並獲取創建最小值的參數。Clojure使用地圖來存儲結果和參數

alist = [1 2 3 4 5 -4] 

; I want [[1 -1] [2 -2] [3 -3]] 
; the following doesn't work. how can i make it work? 
(map #([% (* -1 %)]) [ 1 2 3]) 

它也可以是散列圖,用於存儲結果。
這應該是荒謬的微不足道的,但我不能得到它的工作。此外,我的名單是一個懶惰的seq,所以我不能只用原始列表壓縮結果。

; this doesn't work cause alist is a lazy-seq in my program 
(let [results (map #(* -1 %) alist)] 
    (map vector alist results) 
) 
+0

你的問題對我來說還不清楚,但你可能想看看min-key雖然 – RedDeckWins 2014-10-19 23:41:59

+0

你怎麼得到''[[1 -1] [2 -2] [3 -3]]? – 2014-10-20 01:40:36

回答

2

有許多方法可以做到這一點:

(map (juxt identity #(* -1 %)) [1 2 3]) 

(for [i [1 2 3]] [i (* i -1)]) 

(let [s [1 2 3] result (map #(* -1 %) s)] (map vector s result)) 

(map (fn [i] [i (* i -1)]) [1 2 3]) 

儘管你的要求,相反,使用了一個讓綁定和兩次調用地圖版本作品就好在一個慵懶的-SEQ 。儘管如此,這是最不清楚的方法。

說明爲什麼你的匿名函數是錯誤的:

user> '#([% (* -1 %)]) 
(fn* [p1__17065#] ([p1__17065# (* -1 p1__17065#)])) 

讀者擴展#([% (* -1 %)])對兩個元素的向量函數調用,不帶參數提供給函數調用。這當然是一個錯誤(作爲一個函數使用時,向量應該有1或2個參數,而這不是你想要用你的向量做的事情)。

+0

在懶惰seq上使用(map vector alist結果)時,我必須有另一個錯誤。它只是說了一些錯誤lazy-seq,所以我認爲這是該行的原因(當我添加它時,程序崩潰了)。儘管謝謝!希望從Python到clojure是現實。 – user1639926 2014-10-20 00:01:36

+0

我注意到的另一個小竅門,編輯這個答案可能不夠大,但''(*%-1)''在一個參數' - (-4)'=> -4上調用時相當於'-' – noisesmith 2014-10-20 00:04:42