Ivanori

Ivanori

Algorithm for splitting a list into N sublists

On a page there’re 3 columns. And I have a list of objects. Every object should go one of the 3 columns in the subsequent order.

1 → 1, 2 → 2, 3 → 3, 4 → 1, 5 → 2 and so on.

I’m trying to come up with an algorithm and have difficult to do so.

What’s the best way to do so? A high-level pointer will be fine.

update:

of put that simply: split a list into N sub-lists. The 1st sub-list might be bigger than the rest.

If I have 7 elements and I want to split them into N = 3 sub-lists, there should be created 3 sublists:

[[3 elements], [2 elements], [2 elements]] 

Namely, I want to preserve all the elements. Enum.chunk_every(…, :discard) won’t work.

Most Liked

kokolegorille

kokolegorille

You might use Enum.chunk_every/2 on a collection.

iex> 1..10 |> Enum.chunk_every(3) |> IO.inspect(charlists: :as_list)
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

You could also use remainder like this

iex> for x <- 1..10, do: rem x, 3
[1, 2, 0, 1, 2, 0, 1, 2, 0, 1]
michalmuskala

michalmuskala

def split(list), do: split(list, [], [], [])

defp split([x1, x2, x3 | rest], l1, l2, l3), 
  do: split(rest, [x1 | l1], [x2 | l2], [x3 | l3])
defp split([], l1, l2, l3), 
  do: {Enum.reverse(l1), Enum.reverse(l2), Enum.reverse(l3)}
defp split([x1, x2], l1, l2, l3), 
  do: {Enum.reverse(l1, [x1]), Enum.reverse(l2, [x2]), Enum.reverse(l3)}
defp split([x1], l1, l2, l3), 
  do: {Enum.reverse(l1, [x1]), Enum.reverse(l2), Enum.reverse(l3)}
iex> Test.split(Enum.to_list(1..10))
{[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]}

If your list has always length divisible by 3, you don’t need the last 2 clauses which account for uneven split.

jfeng

jfeng

If you don’t care about the order in which they’re put in the bins, this should work. Definitely suboptimal because of the list length and integer division at each step, though.

def chunker(list, parts), do: do_chunk(list, parts, [])

defp do_chunk(_, 0, chunks), do: chunks

defp do_chunk(to_chunk, parts, chunks) do
  chunk_length = to_chunk |> length() |> div(parts)
  {chunk, rest} = Enum.split(to_chunk, chunk_length)
  do_chunk(rest, parts - 1, [chunk | chunks])
end

iex> chunker([1, 2, 3, 4, 5, 6, 7], 4)
[[6, 7], [4, 5], [2, 3], [1]]
iex> chunker([1, 2, 3, 4, 5, 6, 7, 3)
[[5, 6, 7], [3, 4], [1, 2]]
iex> chunker([1, 2, 3, 4, 5, 6, 7, 10)
['\a', [6], [5], [4], [3], [2], [1], [], [], []]

Last Post!

neuone

neuone

I ended up using this example. It solves my need for now. Thank you.

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40042 209
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

We're in Beta

About us Mission Statement