こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回は二重リストのEnum/内部Enum操作について学んだことをまとめます。
目的
二重リストのデータに対してEnum/内部Enum操作ができるようになる
実行環境
Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.0
Erlang v27.0
前提
- あらかじめ下記で二重リストの変数を定義しておきます
list_of_lists = [[1, 2, 3], [4, 5, 6]]
- なお、本記事では
[[1, 2, 3], [4, 5, 6]]
を「外側のリスト」
外側のリストより1階層深い[1, 2, 3]
および[4, 5, 6]
を「内側のリスト」と呼称しています
やったこと
Enum.with_index
とEnum.map
でlist_of_listsを下記に更新したいとします
updated_list_of_lists = [[1, 12, 3], [4, 5, 6]]
操作をまとめると下記の通りです
updated_list_of_lists =
list_of_lists
|> Enum.with_index()
|> Enum.map(fn
{list, 0} ->
list
|> Enum.with_index()
|> Enum.map(fn
{value, 1} -> 12
{value, _} -> value
end)
{list, _} ->
list
end)
以下に順を追って手順を解説します
1.Enum.with_indexでリストにインデックスを振る
updated_list_of_lists =
list_of_lists
+ |> Enum.with_index()
この時点での断面です。
内側のリストにインデックスが付与されました
[{[1, 2, 3], 0}, {[4, 5, 6], 1}]
2.Enum.mapで操作対象のリストだけに絞り込む
1.のうちインデックスが0のものだけを操作したいので、Enum.mapで絞り込みます
updated_list_of_lists =
list_of_lists
|> Enum.with_index()
+ |> Enum.map(fn
+ {list, 0} ->
+ list
+
+ {list, _} ->
+ list
+ end)
この時点での断面です。
Enum.map内の分岐が書けました。
分岐後の処理はまだ書いていないので出力値は入力値から変わっていません
[[1, 2, 3], [4, 5, 6]]
3.2.で絞り込んだ後のリストにインデックスを振る
操作したい要素を含むリストを対象に、さらにその中の各要素にインデックスを振ります。
今回は内側のリストのうちインデックスが0のリストが対象ですので、{list, 0}
の分岐後にインデックスを振ります
updated_list_of_lists =
list_of_lists
|> Enum.with_index()
|> Enum.map(fn
{list, 0} ->
list
+ |> Enum.with_index()
{list, _} ->
list
end)
この時点での断面です。
内側のリストのうち、インデックスが0のリストの各要素に内側のリストにのみインデックスが付与されました
[[{1, 0}, {2, 1}, {3, 2}], [4, 5, 6]]
4.Enum.mapで操作対象の要素だけを更新する
updated_list_of_lists =
list_of_lists
|> Enum.with_index()
|> Enum.map(fn
{list, 0} ->
list
|> Enum.with_index()
+ |> Enum.map(fn
+ {value, 1} -> 12
+ {value, _} -> value
+ end)
{list, _} ->
list
end)
この時点での断面です。
欲しい出力を得られました
[[1, 12, 3], [4, 5, 6]]
余談
今回はEnum.with_indexとEnum.mapによる二重リストのEnum/内部Enum操作ができることを確認しましたが、もっと効率の良い手順が存在する気がします。
新しく学びを得たらまた記事化していきたいと思います
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩