2016-12-18 22 views
0

重複したリスト(等しいと見なされるオブジェクト)があり、重複を削除したい。注文を保存したいので、setを使用することはできません。リストから重複を削除する:各要素の順序と最後の重複を保持する

私のリストの重複は、お互いの直後ではありません。私は最後の発生を保ちたいと思います。 this related postでは、重複の最初の発生のみが保持されているようです。

私は例を単純化したように、これは私が欲しいものです:

list_with_duplicates = [1, 2, 1, 3, 2, 1] 
list_without_duplicates = [3, 2, 1] 

私は考えることができる唯一のことは、最初の各重複の最後ocurrenceを保存し、元を再作成するために複数の反復を使用して厄介な実装であります最後に発生した重複の順序を使用してリストします。

答えて

2

は、1回の変更で、(例えばtop oneなど)リンク重複してお好きな答えを使用する:あなたが反復する前に、あなたのリストを逆転それを上書きし、完了したら結果を逆にします。

def rem_rev(seq): 
    seen = set() 
    seen_add = seen.add 
    return [x for x in seq[::-1] if not (x in seen or seen_add(x))][::-1] 
    #      ^^^^^^         ^^^^^^ 
    #     or reversed(seq) 
+0

私は本当にブール式は正直に得ることはありません。 'またはseen_add(x)'とは何ですか?私はそれが何らかの形で 'x'を' seen'に追加していないと思っていますが、それが返ってくる値がどのように返ってくるのか分かりません。 – CGFoX

+1

@CGFoX - 'seq [:: - 1]'の各要素については、 'see'になければ、その要素を結果リストに含めます。 'x in seen 'が当てはまらない場合、' x'を 'seen'に追加した結果をチェックし、' None'を返します。基本的には「そこになければそれを含めるか、そうでない場合は追加する」。 – TigerhawkT3

0

あなたが使用してリストを逆にすることができます「:: - 1」:

>>> result = [] 
>>> for item in l[::-1]: 
...  if item not in result: 
...    result.append(item) 
... 
>>> result[::-1] 
[3, 2, 1] 
>>> 
0

ordered dict solutionはかなりきれいになります。

>>> x = [1, 2, 1, 3, 2, 1] 
>>> 
>>> from collections import OrderedDict 
>>> list(reversed(OrderedDict.fromkeys(reversed(x)))) 
[3, 2, 1] 

か:

>>> list(OrderedDict.fromkeys(x[::-1]))[::-1] 
[3, 2, 1] 
関連する問題