我想计算数字列表中连续元素的差异,例如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)
嗯,这是一个非常具体的用例,所以没有内置的解决方案可以完全做到这一点,但我认为使用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