18

Erlangのリストから重複を削除するにはどうすればよいですか?

次のようなリストがあるとします。

[1,1,2,3,4,5,5,6]

どうすれば入手することができますか:

[1,2,3,4,5,6]
4

6 に答える 6

18

そして、リストの順序を維持したい人のために:

remove_dups([])    -> [];
remove_dups([H|T]) -> [H | [X || X <- remove_dups(T), X /= H]].
于 2014-03-02T20:39:36.060 に答える
1

Preserve the order of the elementsリストを操作する方法を学ぶのに役立つ可能性のある解決策には、次の 2 つの関数が含まれます。

delete_all(Item, [Item | Rest_of_list]) ->
    delete_all(Item, Rest_of_list);
delete_all(Item, [Another_item| Rest_of_list]) ->
    [別のアイテム | delete_all(Item, Rest_of_list)];
delete_all(_, []) -> [].

remove_duplicates(リスト)-> 削除(リスト、[])。
除去([]、これ) - >リスト:逆(これ);
除去([A|テール],Acc) ->
    除去(delete_all(A,Tail),[A|Acc])。

テストする、

Eshell V5.9 (^G で中止)
1> mymod:remove_duplicates([1,2,3,1,2,4,1,2,1])。
[1,2,3,4]
2>

于 2012-12-03T08:27:53.543 に答える
0

推奨されていませんが、順序を維持するために最初はこのようなことをします。それ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
    )).
于 2015-09-19T19:52:54.353 に答える
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 ]).
于 2016-07-03T21:45:01.650 に答える