2016-05-06 21 views
-2

ich diese Schule Zuordnung bekam, hier ist mein Code:Manchmal wird keine gedruckt - und manchmal nicht, warum nicht?

class Doubly_linked_node(): 
    def __init__(self, val): 
     self.value = val 
     self.next = None 
     self.prev = None 

    def __repr__(self): 
     return str(self.value) 

class Deque(): 
    def __init__(self): 
     self.header = Doubly_linked_node(None) 
     self.tailer = self.header 
     self.length = 0 

    def __repr__(self): 
     string = str(self.header.value) 
     index = self.header 
     while not (index.next is None): 
      string+=" " + str(index.next.value) 
      index = index.next 
     return string 


    def head_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.next=self.header 
     self.header.prev=new 

     self.header=new 
     self.length+=1 

     if self.tailer.value==None: 
      self.tailer = self.header 

    def tail_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.prev=self.tailer 
     self.tailer.next=new 

     self.tailer=new 
     self.length+=1 

     if self.header.value==None: 
      self.header = self.tailer 

es baut einen Stapel, so dass Sie Elemente aus dem Kopf oder Schwanz hinzuzufügen und zu entfernen (ich schließe nicht den gesamten Code nur die wichtigen Sachen).

Wenn ich ein Objekt einleiten, wenn ich self.next zurückkehren druckt None, aber wenn ich self.prev zurückkehren, druckt es nichts, nur überspringt, ich verstehe nicht, warum, weil sie genau beide gleich definiert sind, wie Sie sehen, und wenn ich einfügen Kopf nur mehrmals zum Beispiel for i in range(1,5): D.head_insert(i) und dann drucke ich D es druckt 5 4 3 2 1 None aber wenn ich Schwanz tue Einsatz zum Beispiel for i in range(1,5): D.tail_insert(i) und Druck D druckt 1 2 3 4 5", wie es sollte, ohne die None. Warum das?

Ich habe ein Bild enthalten:

image

+1

als Faustregel verwenden „ist keine“ statt == None: http://stackoverflow.com/questions/3257919/is-none-vs-none – danielfranca

+1

Bitte siehe http://stackoverflow.com/help/mcve - Fragen zum Code sollten die kleinstmögliche Menge an Code enthalten, die zur Reproduktion des gleichen Problems benötigt werden. –

+0

Es gibt keine "Kopf" und "Schwanz" Methode in der "Deque" Klasse –

Antwort

1
  1. Beachten Sie, dass Sie ein Deque schaffen, die nicht leer ist. Sie initialisieren es mit einem Knoten mit dem Wert None

  2. Sie vertauschen das value und das Node-Objekt. Wenn Sie if self.tailer.value==None: sind überprüft, es ist wahrscheinlich nicht, was Sie bedeutet

  3. 2 eine Sonderbehandlung für den leeren Deque, wo Header und Tailer ist, darauf hinzuweisen Nach None

Hier ist, was ich habe im Hinterkopf, wenn ich die Deque implementieren würde. Ich habe den Rückgabewert von __repr__ etwas geändert.

class Deque(): 
    def __init__(self): 
     self.header = None 
     self.tailer = None 
     self.length = 0 

    def __repr__(self): 
     if self.header is None: 
      return 'Deque<>' 
     string = str(self.header.value) 
     index = self.header.next 
     while index!=None: 
      string+=" " + str(index.value) 
      index = index.next 
     return 'Deque<'+string+'>' 

    def head_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.next=self.header 
     if self.length==0: 
      self.tailer=new 
     else: 
      self.header.prev=new 

     self.header=new 
     self.length+=1 

    def tail_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.prev=self.tailer 
     if self.length==0: 
      self.header=new 
     else: 
      self.tailer.next=new 

     self.tailer=new 
     self.length+=1 
+0

Die 'Klasse Doubly_linked_node():' wird als Teil der Übung angegeben, deshalb muss ich einen bestimmten Wert eingeben. Wie würdest du vorschlagen, dass ich eine "Deque" initiiere, wenn nicht durch Einfügen eines "None"? – Tallb

+0

Danke Gunther, dass es eine gute Lösung ist, indem man 'Deque' nicht als' Doubly_linked_node' einleitet und die Knotenreferenz auf None vermeidet; Ich werde darauf hinweisen, dass der Grund, warum ich die Länge nicht für alle == benutzt habe, dass es ein letzter Zusatz für einen anderen Teil der Aufgabe war (anfangs hatte ich nur Header und Tailer.) – Tallb

+0

Ich denke immer noch, dass ich d bleib bei den 'while not (str (index.next) ==" None "):' weil es schneller repariert ... (obwohl eine sehr hässliche) – Tallb

1

Nach Günthers Beratung habe ich die __repr__ zu dieser Änderung:

def __repr__(self): 
    string = str(self.header.value) 
    index = self.header 
    while not (str(index.next) == "None"): 
     string += (" " + str(index.next.value)) 
     index = index.next 
    return string 

, die das Problem zu lösen haben, aber es ist die hässlichste Lösung, die ich je gesehen habe.

weiß jemand einen besseren Weg?

0

Nach der Frage einer besseren __repr__ Methode hier mein Vorschlag. Erweitern Sie die Klasse Deque mit einer __iter__ Methode. So können Sie durchlaufen die Deque das ist schön zu haben, z.B .:

for item in D: 
    print item 

Basierend auf, dass die __repr__ Methode ist einfach. Hier ist die ganze Änderung:

def __repr__(self): 
    return 'Deque<'+' '.join([str(item.value) for item in self])+'>' 

def __iter__(self): 
    index=self.header 
    while index is not None: 
    yield index.value 
    index=index.next 
+0

Die Funktionen wie vordefiniert, ich darf nicht hinzufügen , nur um sie mit Inhalt zu füllen. – Tallb

Verwandte Themen