Вычислить попарные различия вложенных списков - PullRequest
0 голосов
/ 04 октября 2019

У меня есть список списков, состоящий из следующих элементов (столбцы всегда 5):

(   
 (1 3 2 4 5)   
 (2 5 1 3 1)   
 (0 8 1 2 2)  
 ...  
)

, и я хочу получить другой список, в котором

  • каждый элементявляется списком
  • i-й элемент в n-м подсписке является разницей между i-ю элементами n-го и (n + 1) -ного подсписков исходного ввода.

В приведенном выше примере результат будет:

(   
 (-1 -2 1 1 4)   
 (2 -3 0 1 -1)  
 ... 
)

Первый список (-1 -2 1 1 4) является результатом взятия первого и второго списка висходный ввод

(1 3 2 4 5)
(2 5 1 3 1)

и затем вычитание элемента с тем же индексом

(1-2 3-5 2-1 4-3 5-1)

и т. Д.

Как я могу это сделать?

Ответы [ 2 ]

5 голосов
/ 04 октября 2019

Чтобы работать с парами смежных элементов, вы можете передать map две коллекции: исходную коллекцию и ее офсетную версию:

(defn diffs [xs]
  (map #(map - % %2) xs (rest xs)))
1 голос
/ 04 октября 2019

Амаллой побил меня этим, но так как я уже начал здесь, это версия с использованием Reduce. Это слишком сложно из-за большого количества информации, которую мы должны хранить в аккумуляторе:

(first ; we are only interested in the accumulator, hence the outer 'first'
 (reduce (fn [[acc prev] curr] [(conj acc (mapv - prev curr)) curr])
  [[] (first test)] 
  (rest test)))

И более чистая версия, которая в основном совпадает с ответом Амаллоя выше (мне нравится его больше).

(map (fn [[v1 v2]] (map - v1 v2)) 
     (partition 2 1 test))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...