Finding Elements in One Array but Not Another
From Erlang Community
(Difference between revisions)
| Revision as of 02:37, 31 August 2006 (edit) Cyberlync (Talk | contribs) ← Previous diff |
Current revision (15:01, 24 September 2006) (edit) (undo) Ayrnieu (Talk | contribs) m (typo) |
||
| (2 intermediate revisions not shown.) | |||
| Line 7: | Line 7: | ||
| You want to find elements in list A that aren't in list B. Erlang provides several ways of doing this: | You want to find elements in list A that aren't in list B. Erlang provides several ways of doing this: | ||
| - | Use | + | Use lists:subtract/2 , or the equivalent -- operator. |
| - | The lists module provides the subtract function, which takes two list and returns a new copy of the first list, such that the first occurrence of each element of the second list is removed. For example: | ||
| <code> | <code> | ||
| - | 1> A = | + | 1> A = lists:seq(1,16). |
| [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] | ||
| - | 2> B = | + | 2> B = lists:seq(2,16,2). |
| - | [2,4,6,8 | + | [2,4,6,8,10,12,14,16]. |
| 3> lists:subtract(A,B). | 3> lists:subtract(A,B). | ||
| - | [1,3,5,7,11,13] | + | [1,3,5,7,9,11,13,15] |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| 4> A -- B. | 4> A -- B. | ||
| - | [1,3,5,7,11,13] | + | [1,3,5,7,9,11,13,15] |
| </code> | </code> | ||
| Iterate over the two lists | Iterate over the two lists | ||
| - | You can 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. |
| <code> | <code> | ||
| - | 5> lists: | + | 5> lists:foldr(fun(X,Acc) -> Y=lists:member(X, B), |
| - | 5> if Y -> [X| | + | 5> if Y -> [X|Acc]; |
| 5> true -> ACC | 5> true -> ACC | ||
| - | 5> end end, [], lists: | + | 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] | ||
| </code> | </code> | ||
| - | [[Category:CookBook]] | + | [[Category:CookBook]][[Category:ListRecipes]] |
Current revision
[edit] Problem
You want to find elements that are in one list but not another.
[edit] 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] |

Digg It
Del.icio.us
Reddit
Facebook
Stumble Upon
Technorati

