# Merge two list of same length, empty values in one list filled with values from 2nd

I got two lists x and y, both contain 10 items.
In first list some values are empty, but list 2 contains those values and visa versa, i.e
list x
[“one”]
[]
[“three”]
[“four”]
[]

list y
[]
[“two”]
[]
[]
[“five”]

new list z should contain all values [“one”][“two”][“three”][“four”][“five”], how can I merge them ?

defmodule Example do
def sample([], []), do: []
def sample([head | tail], [[] | tail2]), do: [head | sample(tail, tail2)]
def sample([[] | tail], [head2 | tail2]), do: [head2 | sample(tail, tail2)]
end

first = [["one"], [], ["three"], ["four"], []]
second = [[], ["two"], [], [], ["five"]]

Example.sample(first, second)
# [["one"], ["two"], ["three"], ["four"], ["five"]]
5 Likes

I would maybe start with List.zip/1 which gives you a result like:

[
{"one", ""},
{"", "two"},
{"three", ""},
...
]

And then you Enum.map/2 over it with a custom function that checks the tuple and returns the value.

5 Likes

Snap - you saved me typing…

1 Like

I think it can also be done in one pass, with recursion, keeping the order of the list…

defmodule Koko do
def run [], [], acc do
Enum.reverse acc
end

def run [h1|t1], [h2|t2], acc do
new_acc = [(if not Enum.empty?(h1), do: h1, else: h2) |acc]
run t1, t2, new_acc
end
end
x = [["one"], [], ["three"], ["four"], []]
y = [[], ["two"], [], [], ["five"]]
Koko.run x, y, []
[["one"], ["two"], ["three"], ["four"], ["five"]]

Update: Oh, it looks like @Eiji already provided this solution

1 Like

I would go with: :lists.zipwith(fn [], [v] -> [v] ; [v], [] -> [v] end, list_a, list_b).

2 Likes

Thank you!!!