将列表拆分为N个部分 [英] Split a list into N parts
本文介绍了将列表拆分为N个部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我如何才能做到这一点?Elixir库中没有函数吗?
Enum.split
将列表拆分为两部分
更新:
如果我有7个元素,我想将它们拆分成3个子列表,则应该创建3个子列表:
[[3 elements], [2 elements], [2 elements]]
也就是说,我希望保留所有元素
推荐答案
您可以考虑使用Enum.chunk_every
将列表拆分为n个子列表,每个子列表包含n个Amount元素:
some_list = [1, 2, 3, 4, 5, 6]
Enum.chunk_every(some_list, 2)
[[1, 2], [3, 4], [5, 6]]
先计算列表的总长度:
total_length = length(some_list)
然后将该数字除以所需的零件数量,得出每一块的长度:
desired_amount_of_sublists = 3
chunk_length = Integer.floor_div(total_length, desired_amount_of_sublists)
应该允许您将列表任意分成您需要的部分:
Enum.chunk_every(some_list, chunk_length)
[[1, 2], [3, 4], [5, 6]]
如果您要求每个子列表正好包含n个元素,则可以传入:discard
选项,以便在最后一个子列表少于n个元素时将其丢弃:
Enum.chunk_every([1,2,3,4,5,6,7], 2, 2, :discard)
[[1, 2], [3, 4], [5, 6]]
如果您有不能丢弃任何元素的硬要求,例如需要将剩余元素合并到第一个子列表中,则可以执行以下操作:
说,有了上面的内容,你就会得到:
result_so_far = Enum.chunk_every([1,2,3,4,5,6,7], 2)
[[1, 2], [3, 4], [5, 6], [7]]
首先反转result_so_far
,取其第一个子列表,即[7]
,如下所示:
[last_sublist | other_sublists] = Enum.reverse(result_so_far)
然后检查last_sublist
的长度。如果它对应于chunk_length
,那么您就可以了,result_so_far
就有了预期的结果。
如果它小于chunk_length
,则需要将其元素与result_so_far
的第一个子列表合并,具体操作如下:
[first_sublist | rest ] = Enum.reverse(other_sublists)
[Enum.concat(first_sublist, last_sublist) | rest]
应呈现
[[1, 2, 7], [3, 4], [5, 6]]
这篇关于将列表拆分为N个部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文