Swap-Methode für Listenelemente

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
wuf
User
Beiträge: 1408
Registriert: Sonntag 8. Juni 2003, 09:50

Swap-Methode für Listenelemente

Beitragvon wuf » Montag 22. März 2004, 15:08

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:
Zuletzt geändert von wuf am Montag 22. März 2004, 16:04, insgesamt 1-mal geändert.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 22. März 2004, 15:37

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
Zuletzt geändert von Dookie am Montag 22. März 2004, 17:21, insgesamt 1-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1408
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Montag 22. März 2004, 17:21

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:
Take it easy Mates!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 22. März 2004, 17:36

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot]