Wie wechsle ich die Position von zwei Elementen in einer Python-Liste?

208

Ich konnte im Internet keine gute Lösung für dieses Problem finden (wahrscheinlich, weil Schalter, Position, Liste und Python solche überladenen Wörter sind).

Es ist ziemlich einfach - ich habe diese Liste:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']

Ich möchte die Position von 'password2'und wechseln 'password1'- ohne ihre genaue Position zu kennen, nur dass sie direkt nebeneinander liegen und an password2erster Stelle stehen.

Ich habe dies mit einem ziemlich langwierigen Listenabonnement erreicht, aber ich habe mich gefragt, ob es möglich ist, etwas eleganteres zu finden?

mikl
quelle
Ist Ihr Problem die Effizienz des Versuchs, 'password2' in der Liste zu finden? Kann 'Passwort1' vor 'Passwort2' stehen? Gibt es hier eine gewisse Komplexität, die in Ihrer ursprünglichen Frage nicht vorkommt? Ansonsten stimme ich @unwind zu.
Brent schreibt Code
3
Sie sollten posten, was Sie haben - ich bin gespannt, was Sie unter einem "ziemlich langwierigen Listenabonnement" verstehen.
Samtregar
Etwas in der Art von index1 = index ('password1'); index2 = index ('password2'); order = order [: index2] .append (order [index1]). append (order [index2]). append (order [index1 + 1:]); auf ein paar Zeilen mehr verteilen. Schön, nein.
Mikl

Antworten:

391
    i = ['title', 'email', 'password2', 'password1', 'first_name', 
         'last_name', 'next', 'newsletter']
    a, b = i.index('password2'), i.index('password1')
    i[b], i[a] = i[a], i[b]
samtregar
quelle
165

Der einfache Python-Tausch sieht folgendermaßen aus:

foo[i], foo[j] = foo[j], foo[i]

Jetzt müssen Sie nur noch herausfinden, was iist, und das ist ganz einfach möglich mit index:

i = foo.index("password2")
Kann Berk Güder
quelle
15

In Anbetracht Ihrer Spezifikationen würde ich die Slice-Zuweisung verwenden:

>>> L = ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
>>> i = L.index('password2')
>>> L[i:i+2] = L[i+1:i-1:-1]
>>> L
['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']

Die rechte Seite der Slice-Zuordnung ist ein "umgekehrtes Slice" und kann auch geschrieben werden:

L[i:i+2] = reversed(L[i:i+2])

Wenn Sie das besser lesbar finden, würden es auch viele tun.

Alex Martelli
quelle
Warum funktioniert das nicht, wenn Sie Titel und E-Mail wechseln möchten, das erste Element mit dem zweiten?
Luigi Tiburzi
Entschuldigung, ich verstehe jetzt, es gibt keine Elemente bei i-1, so dass eine leere Liste zurückgegeben wird
Luigi Tiburzi
7

Wie kann es jemals länger sein als

tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp

Das ist nur ein einfacher Austausch mit temporärem Speicher.

entspannen
quelle
13
Wenn Sie wirklich "pythonisch" sein wollen, können Sie dies auch immer tun:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
Brent schreibt Code
0
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

Wenn das letzte Element größer als das Element an der Position iist, werden beide vertauscht.

Ravi Tanwar
quelle
-1

Sie können zum Beispiel verwenden:

>>> test_list = ['title', 'email', 'password2', 'password1', 'first_name',
                 'last_name', 'next', 'newsletter']
>>> reorder_func = lambda x: x.insert(x.index('password2'),  x.pop(x.index('password2')+1))
>>> reorder_func(test_list)
>>> test_list
... ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']
SmartElectron
quelle
-1

Ich bin kein Python-Experte, aber Sie könnten versuchen: sagen

i = (1,2)

res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2)) 

oben würde o / p geben als:

res(1, 2) = (2,1)
Lambzee
quelle
1
Das funktioniert nicht, ohne die Position der zu tauschenden Schlüssel zu kennen.
Mikl