Elixir:计算连续元素差异的惯用方法?

Eri*_*Eng 2 elixir

我想计算数字列表中连续元素的差异,例如input = [1, 2, 3, 5]应该给出输出[-1, -1, -2]

我想出了两种看起来或多或少复杂的方法。有没有更简单、更惯用的方法来做到这一点?

使用邮政编码:

Enum.zip(input, Enum.drop(input,1)) 
|> Enum.map(fn {x,y} -> x-y end)
Run Code Online (Sandbox Code Playgroud)

使用扫描(太复杂):

Enum.scan(input, [0, 0], fn x, [_delta, prev] -> [prev-x, x] end) 
|> Enum.map(fn [x, _y] -> x end) 
|> Enum.drop(1)
Run Code Online (Sandbox Code Playgroud)

She*_*yar 6

嗯,这是一个非常具体的用例,所以没有内置的解决方案可以完全做到这一点,但我认为使用Enum.chunk_every/4惯用的:

chunk_every(enumerable, count, step, leftover \\ [])

count返回包含每个项目的列表的列表,其中每个新块开始将step元素放入可枚举中。


示例及说明:

input
|> Enum.chunk_every(2, 1, :discard)
|> Enum.map(fn [x, y] -> x - y end) 
Run Code Online (Sandbox Code Playgroud)
  • 成员被分组为2元素列表,每个元素
  • 下一个块1从前一个列表的起始元素的步骤之后开始
  • :discard意味着它会丢弃最后剩下的[5]块,因为我们不需要它。
  • 这将返回像这样的组中的元素:[[1, 2], [2, 3], [3, 5]]
  • 最后使用计算每个块的差异Enum.map