2017-05-08 2 views
0

Ich habe es versucht, es gibt die Ausgabe, die es geben sollte ([1,3,2]), jedoch Das Problem ist, dass es die Ausgabe unendlich oft ohne Unterbrechung druckt. Gibt es Lösungen, die die Idee des Codes ändern?Ich möchte eine Funktion schreiben, die eine Liste nimmt und sie mit allen entfernten Duplikaten zurückgibt, ohne eine andere Liste oder Zeichenfolge zu erstellen

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

Warum können Sie keine andere Liste erstellen? Ihr Algorithmus ist O (n^2), was bedeutet, dass er für große Listen sehr ineffizient ist. –

+0

'list (set (a))' ist das einfachste, obwohl es Zwischendatenstrukturen benötigt. Das riecht für mich nach Hausaufgaben. – TemporalWolf

+1

@TemporalWolf, vorausgesetzt, die Elemente in 'a' sind hashable;) –

Antwort

1

while len(L) wird immer wahr sein, solange L etwas in ihm mit

Ändern L beginnen musste, während es mit dem for Schleife können Elemente verursachen übersprungen werden, so dass Sie einen Fehler für einige haben Eingaben.

Wenn Sie dieses Problem beheben, sollten Sie die While-Schleife nicht benötigen.

2

Es sei denn, der Zweck dieser Funktion ist es, Ihre Python-Fähigkeiten auszuüben, es klingt wie Sie wollen ein set. Ein Set ist wie eine Liste, erlaubt jedoch keine doppelten Werte. Wenn Sie Ihre endgültige Datenstruktur wünschen, eine Liste zu sein, könnten Sie so etwas tun:

final_list = list(set(original_list)) 
+0

Es gibt wahrscheinlich gültige Anwendungsfälle, um Duplikate aus einer Liste in-place zu entfernen. –

2

Ein Weg, um dies sicher zu tun, ist eine Schleife über die Liste in umgekehrter Reihenfolge und entfernen Sie nur von der Rückseite:

>>> for i in range(len(a) - 1, -1, -1): 
... if a.count(a[i]) > 1: 
...  del a[i] 
... 
>>> a 
[1, 2, 3] 

Aber dies wird polynomielle Zeit sein, da a.count linear ist und so ist del a[i].

+0

Es ist O (n^2) Zeit - das ist polynomial, aber so sind n^3, n^4, etc ... –

+0

@JohnLaRooy ja, ja, um genau zu sein es ist quadratische Zeit. –

0

Solange die Elemente in a sind hashbar und es Ihnen nichts ausmacht, dass die restlichen Elemente nicht in der gleichen Reihenfolge sind, wenn Sie gestartet, können Sie ein Zwischenprodukt set erstellen und ersetzen Sie den ursprünglichen Inhalt in-place.

a[:] = set(a) 
Verwandte Themen