2010-03-22 2 views
122

Ich konnte keine gute Lösung für dieses Problem im Netz finden (wahrscheinlich, weil Schalter, Position, Liste und Python alle solche überladenen Wörter sind).Wie wird die Position von zwei Elementen in einer Python-Liste geändert?

Es ist ziemlich einfach - ich habe diese Liste:

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

Ich möchte Position 'password2' und 'password1' wechseln - nicht ihre genaue Position zu kennen, nur dass sie miteinander und password2 direkt neben sind ist zuerst.

Ich habe dies mit etwas langatmigen List-Subscripting erreicht, aber ich fragte mich, ob es etwas eleganter sein könnte?

+0

Ist Ihr Problem die Effizienz zu versuchen, "password2" in der Liste zu finden? Kann 'password1' vor 'password2' stehen? Gibt es hier eine gewisse Komplexität, die in Ihrer ursprünglichen Frage nicht auftaucht? Ansonsten stimme ich @unwind zu. –

+3

Sie sollten posten, was Sie haben - ich bin neugierig, was Sie mit einer "ziemlich langatmigen Liste - Subskribierung" meinen. – samtregar

+0

Etwas in der Form von index1 = index ('password1'); index2 = index ('passwort2'); Reihenfolge = Reihenfolge [: Index2] .append (Reihenfolge [Index1]). Append (Reihenfolge [Index2]). Append (Reihenfolge [Index1 + 1:]); verteilt auf ein paar mehr Zeilen. Hübsch, nein. – mikl

Antwort

249
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] 
5

Wie kann es jemals länger als

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

, die mit temporären Speicher nur eine einfache Swap ist.

+6

Wenn du wirklich "Pythonic" darüber sein willst, könntest du das auch immer tun: 'my_list [indexOfPwd2], meine_liste [indexOfPwd2 + 1] = meine_liste [indexOfPwd2 + 1], meine_liste [indexOfPwd2]' –

104

Die einfache Python-Swap sieht wie folgt aus:

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

Alles was Sie jetzt tun müssen, ist, Figur, was i ist, und das kann leicht mit index erfolgen:

i = foo.index("password2") 
13

Angesichts 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 Scheibe Zuordnung ist eine „umgekehrte Scheibe“ und auch geschrieben werden:

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

, wenn Sie das besser lesbar zu finden, wie viele würden.

+0

Warum das nicht ist funktioniert, wenn Sie Titel und Mail wechseln wollen, das erste Element mit dem zweiten? –

+0

Sorry ich verstehe jetzt, es gibt keine Elemente bei i-1, so dass eine leere Liste zurückgegeben wird –

0

Sie zum Beispiel verwenden können:

>>> 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 Experte in Python aber man könnte 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 wie:

res(1, 2) = (2,1) 
+1

Das funktioniert nicht, ohne die Position der Schlüssel zu kennen zu tauschen. – mikl

Verwandte Themen