collections.deque.index

Code-Stücke können hier veröffentlicht werden.
Antworten
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Hallo,

ich habe die Klasse collections.deque erweitert, indem ich ihr die Methode `index` verpasst habe. Es sollte genauso wie list.index funktionieren. Falls ihr Sonderfälle entdecken solltet, wo das nicht der Fall ist, bitte Bescheid sagen. Hier der Code: http://bitbucket.org/derdon/hodgepodge/ ... d_deque.py
lunar

Uhhh ... mit Verlaub, aber gut ist diese Implementierung nicht.

Sie verhält sich dem ersten Eindruck nach wohl nicht korrekt, falls der Wert außerhalb der Grenzen von "start" und "stop" in der Schlange enthalten ist. Dann wird meines Erachtens einfach "None" zurückgegeben, statt eine Ausnahme auszulösen, weil der "in"-Test am Schluss ja nicht wahr wird.

Außerdem hat die Implementierung wegen des wiederholten Index-Zugriffs im Mittel quadratische Laufzeit. Im schlechtesten Fall (der Wert ist nicht enthalten) ist die Laufzeit wegen des "in"-Tests sogar O(n²+n).

Nutze besser enumerate, und löse die Ausnahme ohne den zusätzlichen Test aus:

Code: Alles auswählen

def index(self, value, start=0, stop=maxint):
    for i, item in enumerate(self):
        if i >= start and item == value:
            return i
        elif i >= stop:
            break
    raise IndexError('deque.index(x): x not in list')
Das geht möglicherweise noch eleganter, aber ich bin gerade in Eile.

Edit: Die Funktion muss natürlich ".index()" heißen. Danke, derdon.
Zuletzt geändert von lunar am Sonntag 10. Oktober 2010, 11:50, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Danke für die Kritik. Hab mal wieder was über Laufzeitverhalten gelernt. Aber eine Frage habe ich noch: Warum hast du die Funktion enumerate überschrieben? So hast du ja eine rekursive Funktion geschrieben, weil innerhalb dieser Funktion enumerate aufgerufen wird. Allerdings wird dann nur self übergeben und der Parameter value vergessen.
lunar

Oh, Verzeihung, die Funktion sollte natürlich ".index()" heißen. Ich sagte ja, ich war in Eile ;)

Rekursiv ist die Funktion allerdings, da "enumerate()" trotzdem das entsprechende Builtin aufruft. Für eine Rekursion müsste es "self.enumerate()" heißen ...
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

<klugscheiß>Die *Funktion* von dir ist rekursiv. Bei dir ist keine Klassendefinition zu sehen, also hat self überhaupt keine besondere Bedeutung, nichtmal einer Konvention wegen.</klugscheiß>

Nun aber genug der Klugscheißerei :lol:
lunar

@derdon: Point taken ;) Natürlich sollte das eine Methode der von "deque" abgeleiteten Klasse sein :)
Antworten