拆分两个相等的列表(±1)

时间:2015-10-09 20:53:59

标签: elixir

我知道我可以通过这样做在elixir的两个相等的一半中分割甚至列表:

list   = [1, 2, 3, 4, 5, 6]
len    = length(list)/2 |> round

[a, b] = Enum.chunk(list, len)            # => [[1, 2, 3], [4, 5, 6]]

但是内置了一个 ruby​​-esque 方法还是有一些更有效的方法来处理奇数长度列表?

3 个答案:

答案 0 :(得分:9)

Enum.chunk实际上需要4个参数,如果包含第4个(pad)参数,它将使用奇数长度列表:

iex(14)> Enum.chunk([1,2,3,4,5], 3, 3, [])
[[1, 2, 3], [4, 5]]

答案 1 :(得分:4)

在浏览完文档后,在其他地方搜索时,我仍然没有找到内置的解决方案,但我确实遇到了Enum.split/2。这种方法似乎更适合划分奇数长度列表但返回tuple而不是列表列表。

我仍然不知道这是多么有效。

示例:

def split(list) do
  len = round(length(list)/2)
  Enum.split(list, len)
end


split([1, 2, 3, 4])        # => {[1, 2], [3, 4]}
split([5, 6, 7, 8, 9])     # => {[5, 6, 7], [8, 9]}

答案 2 :(得分:2)

我不相信有更多的惯用语"这样做的方式。我不知道有这样做的内置方法。

一个建议 - 如果你正在处理更大的列表,你可能最好使用Stream而不是Enum。

list = [1,2,3,4,5,6,7,8,9]
s = Stream.take_every(list,2)
l2 = Enum.to_list(s)  #=> [1,3,5,7,9]

然后

l1 = list -- l2 #=> [2,4,6,8]

您最好尽可能使用Stream,因为Stream会被懒惰地评估。在这种特殊情况下,它不会有所作为。但在某些情况下,懒惰的评估可以真正加快速度。

正如我所说,我的代码不再是你的解决方案的惯用语,它肯定不是内置函数。