2015-10-25 4 views
4

Мне нужно создать функцию. В этом мне нужно следующее произойдет:Clojure List -> Vector

List 1: '(a 5 6) 
List 2: '(c 8 10) 
List 3: '(d 4 9) 

Выше списки. Мне нужно игнорировать 1-й столбец каждого списка (это a, c и d.), А затем поместить второй столбец в вектор. Затем сделайте то же самое для третьего столбца, но отдельный вектор. Как только это будет сделано, я проведу небольшую арифметику между ними и напишу результаты каждого из них в третий вектор.

У меня очень мало опыта Clojure и происходит из фона Java. Я пытался использовать let

Таким образом, я смог создать var, который хранит 2-й и 3-й позиции только в одном списке. (например, список 1 5 & 6.) Однако мне нужен вектор, который должен быть [5 8 4].

+0

Это звучит как матричная арифметика. В зависимости от того, что вы хотите делать с данными, [core.matrix] (https://github.com/mikera/core.matrix/wiki) может оказаться полезным. – Mars

ответ

4
(defn answer [& [list-1 list-2 list-3 :as lists]] 
    (->> lists     ; ((a 5 6) (c 8 10) (d 4 9)) 
     (map rest)    ; ((5 6) (8 10) (4 9)) 
     (apply map vector)  ; ([5 8 4] [6 10 9]) 
     (apply small-arithmetic) ; (small-arithmetic [5 8 4] [6 10 9]) 
)) 

предполагая small-arithmetic является функция, принимающая желаемые два вектора и возвращает третий вектор.

+2

Можете ли вы просто запустить меня через ваш ответ, пожалуйста? Таким образом, списки 1, 2 и 3 находятся в списке. Итак, список списков. Будут ли они введены в функцию как параметр? Если это список списков, это вообще изменит ваш ответ. – DoogJames

+0

Я объявил переменную функцию для сбора трех списков аргументов в «списках». '(список ответов-1 list-2 list-3)' - это назначенный вызов. Эквивалентным объявлением будет '(defn answer [list-1 list-2 list-3] (- >> [list-1 list-2 list-3] ...; (как указано выше)' –

+0

Если вход является список списков, которые вы могли бы просто '(defn answer [lists] ...)' и вызывать его, например '(answer [list-1 list-2 list-3])' –

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