Erlang Central

Finding Elements in One Array but Not Another

From ErlangCentral Wiki

Problem

You want to find elements that are in one list but not another.

Solution

You want to find elements in list A that aren't in list B. Erlang provides several ways of doing this:

Use lists:subtract/2 , or the equivalent -- operator.


1> A = lists:seq(1,16).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
2> B = lists:seq(2,16,2).
[2,4,6,8,10,12,14,16].
3> lists:subtract(A,B).
[1,3,5,7,9,11,13,15]
4> A -- B.
[1,3,5,7,9,11,13,15]

Iterate over the two lists

You can iterate over the two lists, and filter out any entries from list A that are also members of list B.


5> lists:foldr(fun(X,Acc) -> Y=lists:member(X, B),
5>    if Y -> [X|Acc];
5>    true -> ACC
5> end end, [], A).
[1,3,5,7,9,11,13,15]
6> lists:filter(fun (X) -> not lists:member(X,B) end, A).
[1,3,5,7,9,11,13,15]