我知道我可以通过这样做在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 方法还是有一些更有效的方法来处理奇数长度列表?
答案 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会被懒惰地评估。在这种特殊情况下,它不会有所作为。但在某些情况下,懒惰的评估可以真正加快速度。
正如我所说,我的代码不再是你的解决方案的惯用语,它肯定不是内置函数。