Эликсир: Как создать пару элементов из списка - PullRequest
0 голосов
/ 12 июня 2018

Учитывая список Elixir с отдельными элементами, как лучше всего создать список с парами смежных элементов?Это должно работать для любого списка, не только содержащего числа.

Ввод: [1,2,3,4,5,6,7]

Ввод: [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]

Следующее решение работает, но выглядит неуклюжея.

Есть ли лучший / более простой способ сделать это?

  >  {[_|list],_} =  Enum.map_reduce([1, 2, 3, 4, 5, 6, 7], nil, fn(x, acc) -> {[acc,x], x} end)
  {[[nil, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]], 7}

  > list
  [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Просто из любопытства:

with [_|rotated] = list <- [1,2,3,4,5,6,7],
  do: list |> Enum.zip(rotated) |> Enum.map(&Tuple.to_list/1)
#⇒ [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]

NB Я публикую это как другой ответ, так как в целом он хуже принятого, но он демонстрирует совершенно другой подход,это может быть сделано, если не существует готовой к использованию функции Enum из коробки.

0 голосов
/ 12 июня 2018

Использование Enum.chunk_every/4:

Enum.chunk_every([1,2,3,4,5,6,7], 2, 1, :discard)
#⇒ [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
...