2017-03-10 9 views
0

重複をリストから削除する必要がありますが、同じリストを返す必要があります。 だから、のようなオプション:それは代わりに新しいリストを作成するようリストから重複を削除しても同じリストを返す

return list(set(list)) 

は、私のために動作しません。ここで

def remove_extras(lst): 
    for i in lst: 
    if lst.count(i)>1: 
     lst.remove(i) 
    return lst 

は、それはいくつかのケースのために働く、私のコードですが、それは[1,1]ときを返すように私は、([1,1,1,1])、それはremove_extrasのために動作しない理由を取得いけません1のカウントは> 1でなければなりません。

+5

まず第一に、あなたは(絶対に必要になるまで)んあなたがループ内で反復処理されているオブジェクトを変更。 –

答えて

2

新しいリストを作成した後で、スライス割り当てを使用してリストの内容を置き換えることができます。結果の場合のために、あなたがsetを使用することができる問題ではありません:

def remove_duplicates(l): 
    l[:] = set(l) 

l = [1, 2, 1, 3, 2, 1] 
remove_duplicates(l) 
print(l) 

出力:

[1, 2, 3] 
+2

ああ、私にそれを打つ。 'l [:] = set(l)'はうまく動作します(内部的には、それがリストされていると思われますが、明示的な変換よりも安いです)。 – ShadowRanger

+0

@ShadowRangerコメントをいただき、ありがとうございました。スライスの割り当てにはリストが必要だと思っていましたが、繰り返し可能なものは動作するようです。 – niemmi

+0

これは私のために、ありがとう! – Silver

0

をあなたは、リストの順番を維持しつつ、重複を除去するOrderedDictを使用してこれを達成することができます。

>>> from collections import OrderedDict 
>>> itemList = [1, 2, 0, 1, 3, 2] 
>>> itemList[:]=OrderedDict.fromkeys(itemList) 
>>> itemList 
[1, 2, 0, 3] 

これは、ランタイムを持っていますO(N)

+0

スライスを 'itemList'に割り当てることなく、これは実際に質問に答えません。 'itemList [:] = OrderedDict.fromkeys(itemList)'が必要です。 – ShadowRanger

+0

@ShadowRanger、ofcourse。私はそれがどのように動作するかを示した。結局のところそれを割り当てることは簡単な部分です。 –

+0

それはOPが持っていた唯一の実際の質問でした。ユニーク化のためのより良い方法を示すのは良いことですが、質問に答える必要があります(元の 'list'が削除されるように、どのように削除するか)。 – ShadowRanger

関連する問題