5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Elixir 二重リストのEnum/内部Enum操作

Last updated at Posted at 2024-10-27

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回は二重リストのEnum/内部Enum操作について学んだことをまとめます。

目的

二重リストのデータに対してEnum/内部Enum操作ができるようになる

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.0
Erlang v27.0

前提

  • あらかじめ下記で二重リストの変数を定義しておきます
iex
list_of_lists = [[1, 2, 3], [4, 5, 6]]
  • なお、本記事では
    [[1, 2, 3], [4, 5, 6]]を「外側のリスト」
    外側のリストより1階層深い[1, 2, 3]および[4, 5, 6]を「内側のリスト」と呼称しています

やったこと

Enum.with_indexEnum.mapでlist_of_listsを下記に更新したいとします

iex
updated_list_of_lists = [[1, 12, 3], [4, 5, 6]]

操作をまとめると下記の通りです

iex
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でリストにインデックスを振る

iex
 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で絞り込みます

iex
 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}の分岐後にインデックスを振ります

iex
 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で操作対象の要素だけを更新する

iex
 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は先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?