2017-07-06 1 views
1

2つのリストを一度に繰り返したいのですが、どうやってその方法を見つけ出すことはできません。複数のリストを持つことができるforループは、ループのネストとして動作し、私はEnumに精通していませんが、そこには解決策があります。エリクサー2つのリストを一度に繰り返して新しいリストを作成する方法は?

のPython、Tclのこの

を達成するためにzip(list_1,list_2)enumerate(list_1)を持っている私にとっても簡単です:

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

およびI」マップ内の要素の1つが特定の条件(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" 
とにかく

誰かが列挙を理解するのを助けることができますか、またはエリキシルの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) 
+3

あなたは[ 'Enum'](HTTPS経由見たことが://hexdocs.pm/elixir/Enum.html)または['List'](https://hexdocs.pm/elixir/List.html)docs?彼らは両方ともジップ機能を持っています。 –

答えて

5

あなたは同じことを実現行うためにエリクサーでEnum.zip/2Enum.map/2を使用することができます

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

'list_of_maps'に' struct 'があった場合、' [%User {...}、%User {...}、...] 'と言うと、これを実行して、 struct [%{...}、%{...}、...] 'のない構造体のマップ...どのようにして構造体('%User {...} ')を維持できますか? – DogEatDog

関連する問題