2017-05-08 4 views
0

これを試してみましたが、出力する必要があります([1,3,2])。問題は、停止せずに無限の時間に出力を印刷し続けることです。コードの考え方を変えて解決策がありますか?別のリストや文字列を作成せずに、リストを取り出してすべての重複を削除した関数を書きたい

a= [1,2,2,2,1,3,2] 
def rem_dup(L): 
    while len(L): 
     for i in L: 
      y= L.count(i) 
      if y>1: 
       L.remove(i) 
     print L 
rem_dup(a) 
+0

他のリストを作成できないのはなぜですか?あなたのアルゴリズムはO(n^2)です。大きなリストでは非常に非効率的です。 –

+0

'list(set(a))'は最も簡単ですが、中間のデータ構造が必要です。これは私の宿題のようなにおいがする。 – TemporalWolf

+1

@TemporalWolf、 'a'の項目がハッシュ可能であると仮定します; –

答えて

1

while len(L)スキップするL項目を引き起こす可能性がありますforループでそれを使用しながら、Lの変更

を開始することで何かを持っていた限り、あなたには、いくつかのためにバグを持っているので、常にtrueになります入力。

この問題を修正した場合は、whileループは必要ありません。

2

この機能のポイントは、あなたのpythonスキルを発揮することではない場合は、setがほしいと思うように聞こえます。セットはリストに似ていますが、重複する値は許されません。

final_list = list(set(original_list)) 
+0

おそらく、リスト内の重複を削除するための有効なユースケースがあります。 –

2

安全にこれを行う1つの方法は、逆に、リストをループにし、背面からのみ削除:

をリストであるためにあなたの最終的なデータ構造をしたい場合は、このような何かを行うことができます
>>> for i in range(len(a) - 1, -1, -1): 
... if a.count(a[i]) > 1: 
...  del a[i] 
... 
>>> a 
[1, 2, 3] 

しかし、これはa.countが線形であり、del a[i]なので多項式時間になります。

+0

それは多項式ですが、n^3、n^4などのO(n^2)時間です。 –

+0

@JohnLaRooyはい、はい、正確には2次の時間です。 –

0

aの項目がハッシュ可能で、開始時に残りの項目が同じ順序でないことを忘れていない場合は、中間のsetを作成して元の内容をその場で置き換えることができます。

a[:] = set(a) 
関連する問題