You can also nest comprehensions. For example:
list = Enum.to_list(1..9)
list_of_lists = Enum.chunk_every(list, 3)
IO.puts("#{inspect(list_of_lists, [charlists: :as_lists])}")
fun = &(&1*&1)
result =
for {row,index} <- Enum.with_index(list_of_lists), into: %{}, do:
{index, (
for element <- row, into: %{}, do: {element, fun.(element)}
)}
IO.puts("#{inspect(result)}")
iex(1)> list = Enum.to_list(1..9)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
iex(2)> list_of_lists = Enum.chunk_every(list, 3)
[[1, 2, 3], [4, 5, 6], '\a\b\t']
iex(3)> IO.puts("#{inspect(list_of_lists, [charlists: :as_lists])}")
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
:ok
iex(4)> fun = &(&1*&1)
#Function<6.127694169/1 in :erl_eval.expr/5>
iex(5)> result =
...(5)> for {row,index} <- Enum.with_index(list_of_lists), into: %{}, do:
...(5)> {index, (
...(5)> for element <- row, into: %{}, do: {element, fun.(element)}
...(5)> )}
%{
0 => %{1 => 1, 2 => 4, 3 => 9},
1 => %{4 => 16, 5 => 25, 6 => 36},
2 => %{7 => 49, 8 => 64, 9 => 81}
}
iex(6)> IO.puts("#{inspect(result)}")
%{0 => %{1 => 1, 2 => 4, 3 => 9}, 1 => %{4 => 16, 5 => 25, 6 => 36}, 2 => %{7 => 49, 8 => 64, 9 => 81}}
:ok
iex(7)>
… keeping in mind that for
is a comprehension expression, not a for
(loop) statement. As a rule you do not use comprehensions for side effects like “printing data” but for data transformation into
a Collectable
(a list by default).