我是Clojure的新手,我一直在翻譯一些我最近做過的數據操作工作,以幫助學習。我有一個函數翻譯工作正常,並且更短,但感覺更不可讀。任何人都可以提出更可讀和/或更習慣的方式來處理這個問題嗎?在Clojure中處理這個序列轉換的最佳方式是什麼?
在Python:
def createDifferenceVector(v,startWithZero=True):
deltas = []
for i in range(len(v)):
if i == 0:
if startWithZero:
deltas.append(0.0)
else:
deltas.append(v[0])
else:
deltas.append(v[i] - v[i-1])
return deltas
我在Clojure的翻譯嘗試:
(defn create-diff-vector [v start-zero]
(let [ext-v (if start-zero
(cons (first v) v)
(cons 0 v))]
(for [i (range 1 (count ext-v))]
(- (nth ext-v i) (nth ext-v (- i 1))))))
這可能是因爲它的可讀性只是因爲我的經驗不足使用Clojure的,但特別的訣竅對輸入向量預先添加一個元素讓我感覺像是模糊了這個意圖。我嘗試過的所有解決方案都沒有使用預先設定的技巧,這些解決方案的時間更長,更醜陋。在Clojure中,許多序列轉換令人難以置信的優雅,但到目前爲止,我發現挑戰的是像這樣的一個,它們a)適合於通過索引而不是元素來操作,和/或b)需要特殊處理對於某些元素。
感謝您的任何建議。
非常酷。我總是忘記我可以這樣做'(map foo x(rest x))'thing - 我通常到達'partition',而不是像'[for [[ab](partition 2 1 v)]( - ba) )'。地圖更好,謝謝提醒。 – amalloy
謝謝。這是一個非常明確的解釋,並且以更多更優雅的方式表達它。這肯定會讓我花一些時間來圍繞着Clojure的思維方式,但我已經看到了收益。 – eggsyntax
嘿。五年後,現在是一名專業的Clojure /腳本開發人員,我恰好碰巧遇到了這個問題。獨立撰寫了一個解決方案,最後幾乎與你的一樣,逐字逐句地相同,@丹尼爾。感謝您幫助我走上正確的道路 – eggsyntax