Seite 1 von 1

collections.deque.index

Verfasst: Sonntag 10. Oktober 2010, 01:05
von derdon
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

Re: collections.deque.index

Verfasst: Sonntag 10. Oktober 2010, 08:29
von 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.

Re: collections.deque.index

Verfasst: Sonntag 10. Oktober 2010, 11:38
von derdon
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.

Re: collections.deque.index

Verfasst: Sonntag 10. Oktober 2010, 11:49
von 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 ...

Re: collections.deque.index

Verfasst: Sonntag 10. Oktober 2010, 16:10
von derdon
<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:

Re: collections.deque.index

Verfasst: Sonntag 10. Oktober 2010, 16:13
von lunar
@derdon: Point taken ;) Natürlich sollte das eine Methode der von "deque" abgeleiteten Klasse sein :)