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?


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]

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")

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.


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.


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.


-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']

-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)

1
Das funktioniert nicht, ohne die Position der zu tauschenden Schlüssel zu kennen.
Mikl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.