2017-07-06 21 views
1

我想一次遍歷兩個列表,但不知道如何。 for循環,它允許你有多個列表作爲嵌套for循環,我不熟悉Enum,但也許有一個解決方案。Elixir如何一次迭代兩個列表以生成新列表?

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 

但我無法弄清楚如何做到這一點的藥劑。

我想這樣做的原因是因爲我有這樣

[%{"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"] 

和我D類似於通過一個循環來運行它們在一起以取代在地圖項目是否以及何時在地圖中的元件中的一個是在一定條件(不爲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中的兩個列表嗎?

+3

您是否通過['Enum']看了(HTTPS ://hexdocs.pm/elixir/Enum.html)或['List'](https://hexdocs.pm/elixir/List.html)文檔?他們都有一個zip功能。 –

回答

5

您可以使用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) 
+0

如果我們在'list_of_maps'中有'struct',我們假設'[%User {...},%User {...},...]',然後我們運行這個,得到沒有結構'[%{...},%{...},...]的映射'......在整個過程中如何維護結構體('%User {...}')? – DogEatDog

2

或者使用comprehension

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