2012-02-08 3 views
2

Задача: У меня есть коллекция векторов или списков, которые я хотел бы найти идиоматический способ суммирования на существующий вектор, возможно, с неравномерными векторами. надуманный пример, показывающая установку:Идиоматический способ суммирования нескольких векторов в Clojure

=>(def collated-list [2 3 4 5 6 7 8]) 
=>(def lists-to-add (partition-all 3 collatedlist)) 
=>(def base-list [1 1 1]) 

Я хотел бы результат суммировать неисправный разбор по спискам на base-list, например, первый элемент будет 1 + 2 + 5 + 8 и так далее.

Что я пробовал: Я попытался map и for петли в нескольких различных способах, но я, кажется, сталкиваюсь либо проблемы с Ленивым секвенирование или проблемами в попытке добавить Integer к Vector.

Это мои первые эксперименты с Clojure, поэтому почти наверняка я неправильно понимаю функциональную итерацию здесь.

Благодаря

+0

Смотрите также гее (изменение поведения карты в Clojure) (http://stackoverflow.com/questions/9033678/changing-map-behaviour-in-clojure), который имеет дело с 'map'-with-padding в общем случае (т. с произвольной функцией, количеством списков и дополняющим элементом). –

ответ

4

Прежде всего, это будет намного проще, если списки-к-оных содержит списки четной длины, поэтому использовать partition вместо partition-all:

(def lists-to-add (partition 3 3 '(0 0) collated-list)) 

И тогда вы можете сделать суммирование с map и рекурсии:

(defn sum-lists [base-lists lists-to-add] 
    (reduce #(map + %1 %2) base-list lists-to-add)) 
+7

Или даже проще (примените карту + список базовых списков для добавления) –

+0

@RomanBataev приятно! – liwp

+0

Спасибо liwp и @Roman Bataev за восхитительно простую версию. – jamiei

0
; List of list 
(def lst (partition 5 (range 200))) 

; Base list 
(def base [1 1 1 1 1]) 

; Sum operation 
(apply map (fn [& args] (apply + args)) base lst) 
+0

Это не будет работать должным образом с неравномерными векторами. Кроме того, вы можете просто использовать + вместо (fn [& args] (apply + args)) –

Смежные вопросы