【问题标题】:Elixir how to iterate over two lists at once to produce a new list?Elixir 如何一次迭代两个列表以生成一个新列表?
【发布时间】:2017-12-09 20:18:47
【问题描述】:

我想一次遍历两个列表,但不知道怎么做。 for 循环,它允许您将多个列表用作嵌套 for 循环,我对 Enum 不太熟悉,但也许那里有解决方案。

Python 有 zip(list_1,list_2)enumerate(list_1) 来完成这项工作

在 Tcl 中对我来说更容易:

% foreach var1 [list 1 3] var2 [list 2 4] {
    puts "$var1 $var2"
  }
1 2
3 4

但我不知道如何在 Elixir 中做到这一点。

我想这样做的原因是因为我有一个这样的地图列表

[%{"a" => "1539", "b" => "300"},
 %{"a" => "4095", "b" => "0"},
 %{"a" => "5371", "b" => "0"},
 %{"a" => "7524", "b" => "0"},
 %{"a" => "8267", "b" => "27"}]

我有一个相同大小的项目列表:

["a","b","c","d","e"]

如果地图中的元素之一是特定条件(不是 0),我想一起通过循环运行它们以替换地图中的项目:

[%{"a" => "a", "b" => "300"},   # notice the change in element "a"
 %{"a" => "4095", "b" => "0"},
 %{"a" => "5371", "b" => "0"},
 %{"a" => "7524", "b" => "0"},
 %{"a" => "e", "b" => "27"}]    # notice the change in element "a"

无论如何。有人可以帮助我理解 enumerable 或如何遍历 elixir 中的两个列表吗?

【问题讨论】:

  • 您查看过EnumList 文档吗?它们都具有 zip 功能。

标签: elixir enumeration


【解决方案1】:

或者,使用comprehension

for {map, item} <- Enum.zip(list_of_maps, list_of_items),
  into: [],
    do: if (map["b"] == "0"), do: map, else: %{map | "a" => item}

【讨论】:

    【解决方案2】:

    你可以在 Elixir 中使用 Enum.zip/2Enum.map/2 来完成同样的事情:

    list_of_maps
    |> Enum.zip(list_of_items)
    |> Enum.map(fn {map, item} -> 
       if (map["b"] == "0"), do: map, else: Map.put(map, "a", item)
    end)
    

    【讨论】:

    • 如果我们在list_of_maps 中有一个struct,比如说[%User{...}, %User{...},...],然后我们运行它,我会得到一个没有结构[%{...},%{...},...] 的地图列表......我怎么能在整个过程中维护结构(%User{...})?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多