2016-09-26 3 views
0

verändert und versuchte, am Ende der Liste doppelte Elemente anhängen whithout den Auftraganhängen Elemente am Ende der Liste duplizieren whithout die Reihenfolge

testlist = [1, 2, 32, 8, 1, 17, 5, 2, 42, 13, 56] 

def duplicate(alist): 
    p = len(alist) 
    duplicate = False 
    for i in range(0, p): 
     for j in range (i + 1, p): 
      if alist[i] == alist[j]: 
       b = alist.index(alist[j]) 
       a = alist.pop(b) 
       alist.append(a) 
       p -= 1 
       duplicate = True 

    print alist 

if duplicate == False: 
    print "No duplicate item found" 

duplicate(testlist) 

OUTPUT Wechsel: [32, 8, 1, 17, 5, 2, 42, 13, 56, 1, 2]

SOLL OUTPUT: [1, 2, 32, 8, 17, 5, 42, 13, 56, 1, 2]

Jede Hilfe, was ich falsch tue hier

+0

Könnten Sie den Einzug Ihres Codes beheben? Wir können nicht sagen, ob Sie ein Problem durch falsche Einrückung haben oder nicht :) – kfb

+1

Was denken Sie, 'alist.pop (b) 'tut? –

+0

Ihr Code sollte mindestens frei von Syntaxfehlern sein (außer es ist die Syntax, mit der Sie Hilfe benötigen). Dieser Code ist zur Zeit nicht grammatikalisch Python – holdenweb

Antwort

2

ich denke, dass in diesem Fall die Schaffung eines neuen li st ist effizienter und deutlich im Vergleich zu den Permutationen in der ursprünglichen Liste:

testlist = [1, 2, 32, 8, 1, 17, 5, 2, 42, 13, 56] 

def duplicate(alist): 

    filtered, duplicates = [], [] 
    for element in alist: 
     if element in filtered: 
      duplicates.append(element) 
      continue 
     filtered.append(element) 

    if not duplicates: 
     print "No duplicate item found" 
     return alist 
    return filtered + duplicates 

new_list = duplicate(testlist) 
print new_list 
+0

Ich habe etwas ähnliches gemacht, nur ein Set für bereits gesehene Elemente verwendet. Ich denke, es ist die beste Antwort. – polku

+0

'set' ist nicht speichern Reihenfolge, so dass es hier nicht benötigt wird – ShabashP

+0

Ja, es war nicht klar, ich meinte eine Menge zu wissen, welche Elemente bereits gesehen werden, aber die doppelten Elemente sind in der Tat in eine Liste gesetzt. Macht sowieso keinen großen Unterschied, deshalb habe ich keine Antwort gegeben. – polku

0

Sie die Kollektionen Modul OrderedDict für die Aufrechterhaltung der Ordnung der Elemente erhalten verwenden.

Die Technik, die wir hier verwenden, ist ein Wörterbuch zu erstellen, um die Anzahl der Vorkommen jedes Elements im Array zu speichern und die dict verwenden, um die Anzahl der Vorkommen für die spätere Verwendung zu suchen.

In der for Schleife suchen wir nach, ob bereits ein Element in der dict mit der get Methode vorhanden ist. Wenn true dann erhöhen wir den Zähler sonst initialisiere den Zähler auf Null.

import collections 
lst = [1, 2, 32, 8, 1, 17, 5, 2, 42, 13, 56] 

# Create a dictionary storing the the number of occurences 
occurences_dict = collections.OrderedDict() 
for i in lst: 
    occurences_dict[i] = occurences_dict.get(i, 0) + 1 

final = occurences_dict.keys() + [k for k, v in occurences_dict.items() if v>1] 

print final 
>>> [1, 2, 32, 8, 17, 5, 42, 13, 56, 1, 2] 
+0

Ihre Lösung beinhaltet das Erstellen und Füllen des Wörterbuchs, die Erstellung und Verkettung der Listen ... nicht zu teuer für die Permutationen der Liste? – ShabashP

+0

Aber das würde nie zu "O (n^2)" kommen, es wäre immer noch "O (n)", wenn du klar siehst. – ZdaR

+0

Ok, es wird 'O (n)' sein, aber du wiederholst die Liste zweimal. Plus verwenden Sie Vergleich in der zweiten Schleife. – ShabashP

0

Ich löste es auf diese Weise. Ich habe auch einige Änderungen vorgenommen, um den Code etwas pythischer zu machen.

test_list = [1, 2, 32, 8, 1, 17, 5, 2, 42, 13, 56] 

def duplicate(a_list): 
    list_length = len(a_list) 
    duplicate = False 
    checked = [] 
    for i in range(list_length): 
     if a_list.count(a_list[i]) > 1: 
      if a_list[i] not in checked: 
       duplicate = True 
       a_list.append(a_list[i]) 
       checked.append(a_list[i]) 
    if duplicate == False: 
     print("No duplicate item found") 
     return None 
    return a_list 

print(duplicate(test_list)) 
0

Anstatt die Werte zu überprüfen, vergleichen Sie den Index.

Bitte überprüfen Sie diesen Code:

testlist = [1, 2, 32, 8, 1, 17, 5, 2, 42, 13, 56,32] 

print("Original list - ",testlist) 
tmp_list = [] 
exclude =[] 
for i in range(len(testlist)): 
    if i == testlist.index(testlist[i]): 

     tmp_list.append(testlist[i]) 
    else: 
     exclude.append(testlist[i]) 
tmp_list.extend(exclude) 
testlist = tmp_list 

print("Updated list - ",testlist) 

Ausgang:

C:\Users\dinesh_pundkar\Desktop>python c.py 
Original list - [1, 2, 32, 8, 1, 17, 5, 2, 42, 13, 56, 32] 
Updated list - [1, 2, 32, 8, 17, 5, 42, 13, 56, 1, 2, 32] 

C:\Users\dinesh_pundkar\Desktop> 
Verwandte Themen