将列表拆分为N个部分 [英] Split a list into N parts

查看:9
本文介绍了将列表拆分为N个部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定一个列表,我如何将其拆分为N个子列表?它们不一定要有相同的大小。例如,给定9个元素并将其拆分成N=3个子列表=>3x3。或到N=4个子列表=>2、2、2和1。

我如何才能做到这一点?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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆