如何从Erlang中的列表中删除副本?
假设我有一个列表:
[1,1,2,3,4,5,5,6]
我怎样才能得到:
[1,2,3,4,5,6]
答案 0 :(得分:35)
您可以使用sets
,例如:
my_nonDuplicate_list1() ->
List = [1,1,2,3,4,5,5,6],
Set = sets:from_list(List),
sets:to_list(Set).
这会返回[1,2,3,4,5],不再重复,但很可能没有排序。
不使用sets
的另一种可能性是:
my_nonDuplicate_list2() ->
List = [1,1,2,3,4,5,5,6],
lists:usort(List).
在这种情况下,它返回[1,2,3,4,5],不再重复并排序。
答案 1 :(得分:9)
对于那些希望保留列表顺序的人:
remove_dups([]) -> [];
remove_dups([H|T]) -> [H | [X || X <- remove_dups(T), X /= H]].
答案 2 :(得分:1)
Preserve the order of the elements
帮助您学习如何操作列表的可能解决方案将涉及两个功能:
delete_all(Item, [Item | Rest_of_list]) -> delete_all(Item, Rest_of_list); delete_all(Item, [Another_item| Rest_of_list]) -> [Another_item | delete_all(Item, Rest_of_list)]; delete_all(_, []) -> []. remove_duplicates(List)-> removing(List,[]). removing([],This) -> lists:reverse(This); removing([A|Tail],Acc) -> removing(delete_all(A,Tail),[A|Acc]).
进行测试,
Eshell V5.9 (abort with ^G) 1> mymod:remove_duplicates([1,2,3,1,2,4,1,2,1]). [1,2,3,4] 2>
答案 3 :(得分:0)
模块sets
有两个可以组合的函数并以有效的方式完成工作:sets:from_list/1
返回一个包含列表所有元素的集合(没有来自定义的重复元素)和{ {1}}返回包含集合元素的列表。以下是使用示例:
sets:to_list/1
我们可以将函数定义为
4> sets:to_list(sets:from_list([1,1,2,3,4,5,5,6])).
[3,6,2,5,1,4]
答案 4 :(得分:0)
对于我的观点,最好的选择是使用lists:usort()
但是如果您不想使用BIF,并且您希望对列表进行排序,我建议使用快速排序版本,在此实现中,您将获得排序的列表,而不会重复值。
unique_sort([]) -> [];
unique_sort([Pivot|T]) ->
unique_sort ([X || X <- T, X < Pivot ) ]++
[Pivot] ++
unique_sort ([X || X <- T, X > Pivot ]).
答案 5 :(得分:-1)
我会先做这样的事情以保持秩序,但不推荐。请记住,AddedStuff ++ Accumulator
可以,但Accumulator ++ AddedStuff
非常糟糕。
rm_dup(List) ->
lists:foldl(
fun(Elem, Acc) ->
case lists:member(Elem, Acc) of
true ->
Acc;
false ->
Acc ++ [Elem]
end
end, [], List
).
如果您想保留订单,此解决方案效率更高:
rm_dup(List) ->
lists:reverse(lists:foldl(
fun(Elem, Acc) ->
case lists:member(Elem, Acc) of
true ->
Acc;
false ->
[Elem] ++ Acc
end
end, [], List
)).