2017-07-06 4 views
1

Ich würde gerne über zwei Listen auf einmal iterieren, kann aber nicht herausfinden, wie. Die for-Schleife, die Ihnen erlaubt, mehrere Listen zu haben, fungiert als verschachtelte for-Schleifen und ich bin nicht so vertraut mit Enum, aber vielleicht gibt es eine Lösung dort.Elixier, wie man über zwei Listen gleichzeitig iteriert, um eine neue Liste zu erzeugen?

Python hat zip(list_1,list_2) und enumerate(list_1) diese

In Tcl zu erreichen, ist es einfacher für mich:

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

Aber ich kann nicht herausfinden, wie es in Elixir zu tun.

Der Grund, warum ich es tun möchte, ist, weil ich eine Liste von Karten wie diese

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

und ich habe eine Liste der Elemente, die gleiche Größe haben:

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

und ich Ich möchte sie durch eine Schleife laufen lassen, um Elemente in der Karte zu ersetzen, wenn eines der Elemente in der Karte eine bestimmte Bedingung erfüllt (nicht 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" 

Wie auch immer. Kann mir jemand helfen, aufzählbar zu sein oder wie man über zwei Listen in Elixier iteriert?

+3

Haben Sie durch das sah [ 'Enum'] (https : //hexdocs.pm/elixir/Enum.html) oder ['List'] (https://hexdocs.pm/elixir/List.html) Dokumente? Beide haben eine Zip-Funktion. –

Antwort

5

Sie Enum.zip/2 und Enum.map/2 in Elixir verwenden können, um die gleiche Sache zu tun zu erreichen:

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

Wenn wir eine 'struct' in' list_of_maps' hätten, sagen wir '[% User {...},% User {...}, ...]', und dann haben wir das ausgeführt, ich bekomme eine Liste von maps ohne die Struktur '[% {...},% {...}, ...]' ... wie kann ich die Struktur ('% User {...}') während des gesamten Prozesses beibehalten? – DogEatDog

2

Oder mit der comprehension:

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