2015-11-06 22 views
7

リストから重複しない値を見つけようとしています。elixir-langリスト内の重複しない要素を見つける

元のリスト:

iex> list = [2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10] 
[2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10] 

iex> unique = Enum.uniq(list) 
[2, 3, 4, 5, 6, 7, 8, 9, 10] 

iex> nondupes = unique -- Enum.uniq(list -- unique) 
[2, 3, 5, 7] 

結果:[2、3、5、7]

エリキシルでこれを達成するためのより良い方法があった場合、私は思っていた

/アーラン

答えて

10

別大規模なデータの方が高速である可能性がある方法(必ずしも良いとは限りません)は、要素からその数にマップを作成し、数が1のものを選択することです。

list 
|> Enum.reduce(%{}, fn (el, acc) -> Dict.put(acc, el, Dict.get(acc, el, 0) + 1) end) 
|> Enum.filter(fn {key, val} -> val == 1 end) 
|> Enum.map(fn {key, val} -> key end) 

これはソリューションに必要なO(n^2)の代わりにランタイムO(n * log(n))を持つ必要があります(入力全体が既に一意である場合は減算が2次である必要があります)。ここで

+2

ます。また '二組、ユニークなもので、あなたがこれまでに見てきたすべてのエントリを保つ1と相互にreduce'ことができます。すべての項目について、表示されたリストにある場合はuniqから削除する必要があります。そうでない場合は両方に追加します。 –

+2

ちょっとした改善:reduceステップでは、手動get/putの代わりに '&Dict.update(&2、&1、1、fn x - > x + 1 end)'を使うこともできます。 –

0

REDO

(パヴェルが指摘したように、私はむしろのみuniqifyingビットに対処し、質問に答えていませんでした。私は以下の楽しみのために船外に行ってきましたので。)

は、純粋に再帰的ですシングルパス、マッチングのみの方法:

-module(nondupes). 
-export([leave_uniques/1]). 

leave_uniques(L) -> 
    lists:reverse(lu(lists:sort(L))). 

lu(L = [H,H|_]) -> lu(L, [], dupe); 
lu([H|T])  -> lu(T, [H], solo). 

lu([H,H], A, dupe)   -> A; 
lu([_,H], A, dupe)   -> [H|A]; 
lu([H,H], A, solo)   -> A; 
lu([P,H], A, solo)   -> [P,H|A]; 
lu([H | T = [H|_]], A, dupe) -> lu(T, A, dupe); 
lu([_ | T], A, dupe)   -> lu(T, A, solo); 
lu([H | T = [H|_]], A, solo) -> lu(T, A, dupe); 
lu([P | T], A, solo)   -> lu(T, [P|A], solo). 

過去の経験がどの裁判官であれば、それはおそらくリスト/セット減算よりも大規模なリストの詳細パフォーマンスである - しかし、過去の経験でも、時間PEのほとんどと言われます成果は本当に大きな問題ではありません。とにかく、これは面白いものでした。

用途:

2> nondupes:leave_uniques([2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10]). 
[2,3,5,7] 
+0

私はこれが質問に答えるとは思わない - これは基本的には 'Enum.uniq'の再実装です。質問とルーチンの予想される出力を見てみましょう。 –

+0

@PawełObrok確かに。あなたが望む完全なフォームは、セット/リスト操作を使って、あなたがやったことである。ですから、あなたの質問にできるだけ徹底的に適切に答えるには、ここでは一人のパスでユニークなメンバーを抽出する純粋なルーチンがあります。それはあなたに笑いを与えることを願っています:-) – zxq9

関連する問題