Seite 1 von 1

Swap-Methode für Listenelemente

Verfasst: Montag 22. März 2004, 15:08
von wuf
Hallo Python Freunde

Ich habe eine Frage zur Manipulation von Listen.
Hier folgt eine Versuchsliste:

liste = [a,b,c,d,e,f]

In dieser Liste möchte ich Elemente untereinander tauschen.
Zum Beispiel möchte ich bei der obigen Liste Element a mit f
tauschen. Die resultierende Liste würde wie folgt aussehen:

resliste = [f,b,c,d,e,a]

Gibt es in Python eine Methode die es ermöglicht Elemente
direkt mit Hilfe einer Indexangabe zu tauschen (swappen).
Meine Vorstellung für den obigen Fall wäre:

liste.swap(0,5)

Besten Dank für Eure Hilfe

Gruss wuf :wink:

Verfasst: Montag 22. März 2004, 15:37
von Dookie
Hi wuf,

swappen geht in Python so:

Code: Alles auswählen

liste[0], liste[5] = liste[5], liste[0]
Du kannst aber (ab Python2.2) auch eine eigene Klasse von list ableiten, und um eine swap-Methode erweitern.

Code: Alles auswählen

class swap_list(list):
    def swap(self,a,b):
        self[a], self[b] = self[b], self[a]
        return self
Das return self am Ende brauchts zwar nicht, ich mache es aber auch bei inplace-operationen, weil dann auch das Ergebnis der Methode verwendet werden kann und ja nur eine Referenz auf das Objekt zurückgegeben wird.


Gruß

Dookie

Verfasst: Montag 22. März 2004, 17:21
von wuf
Hi Dookie

Besten Dank für Deine lehrreichen Vorschläge. Habe sie ausprobiert.
Funktionieren bestens! Konstruierte anhand Deinem ersten Vorschlag
folgende Methode:

Code: Alles auswählen

def swap(list,src,dest):
	list[dest],list[src] = list[src],list[dest]
	return list
Test der Methode:

Code: Alles auswählen

mylist = ['a','b','c','d','e','f']
print swap(mylist,0,5)
Dein zweiter Vorschlag habe ich wie folgt ausprobiert:

Code: Alles auswählen

list = swap_list(mylist)
print list.swap(0,5)
Wie ist die Anwendung Deines zweiten Vorschlages, wenn mehrere
Listen manipuliert werden müssen. Beim folgenden Beispiel mit
zwei Listen:

Code: Alles auswählen

mylist1 = ['a','b','c','d','e','f']
mylist2 = ['g','h','i','j','k','l']
Meine Lösung:

Code: Alles auswählen

list = swap_list(mylist1)
print list.swap(0,5)

list = swap_list(mylist2)
print list.swap(0,5)
Gruss wuf :wink:

Verfasst: Montag 22. März 2004, 17:36
von Dookie
Hi wuf,

Merke: benenne eine Variable nie wie eine eingebaute Funktion oder Klasse!

Ich würde die zwei Listen gleich als instanzen von swap_list erzeugen.

Code: Alles auswählen

mylist1 = swap_list(('a','b','c','d','e','f'))
mylist2 = swap_list(['g','h','i','j','k','l'])
print mylist1.swap(0,5)
print mylist2.swap(0,5)
for a, b in zip(mylist1,mylist2):
    print a, b
mylist3 = swap_list("mnopqr")
mylist3.reverse()
print mylist3
Du siehst, Instanzen der neuen Klasse kannst Du wie herkömmliche Listen verwenden und hast auch alle Methoden die für Listen definiert sind. Das ist OOP 8)


Gruß

Dookie