# Finding unique elements of a list

Ulf Wiger (AL/EAB) <>
Wed Dec 1 18:10:23 CET 2004

```To my knowledge, there's no such function.
Not that I doubt your ability to write one yourself,
but here's a suggestion:

u(L) -> u(L, []).
u([H|T], Acc) ->
case lists:member(H,Acc) of
true ->  u(T, Acc);
false -> u(T, [H|Acc])
end;
u([], Acc) ->
lists:reverse(Acc).

Here's another one, shorter, O(1), and, most importantly,
cuter (functional purists may retch at will):

u2(L) ->
T = ets:new(temp,[set]),
L1 = lists:filter(fun(X) -> ets:insert_new(T, {X,1}) end, L),
ets:delete(T),
L1.

/Uffe

> -----Original Message-----
> From:
> [mailto:]On Behalf Of James Hague
> Sent: den 1 december 2004 17:48
> To: ''
> Subject: Finding unique elements of a list
>
>
> Is there a standard Erlang library function or idiom for
> removing duplicate
> items from an unsorted list?  Ideally the elements in the
> final list should
> be in the order they were passed in, except without duplicates:
>
> 	[3,5,2,2,3] -> [3,5,2].
>
> If order doesn't matter there are some easy options:
>
> 1. lists:usort(L)
> 2. gb_sets:to_list(gb_sets:from_list(L))
>
> If order does matter, then the only thing I've come up with
> is to build an
> ets table or gb_set iteratively, adding each element not
> previously in the
> table or set to a list of unique items.  Is there an obvious library
> function I'm not seeing?  Feels like there should be lists:unique/1.
>

```