it-swarm.com.de

Wie kann ich die Position von zwei Elementen in einer Python-Liste ändern?

Ich habe im Netz keine gute Lösung für dieses Problem finden können (wahrscheinlich, weil switch, position, list und Python alle 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 'password1' wechseln - ich weiß nicht genau, wo sie sich befinden, nur dass sie direkt nebeneinander liegen und password2 an erster Stelle steht.

Ich habe dies mit ziemlich langatmigen Listensubskriptionen geschafft, aber ich fragte mich, ob es möglich ist, etwas eleganteres zu finden?

166
mikl
    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]
328
samtregar

Der einfache Python-Swap sieht folgendermaßen aus:

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

Jetzt musst du nur noch herausfinden, was i ist, und das lässt sich leicht mit index erledigen:

i = foo.index("password2")
135
Can Berk Güder

Bei Ihren 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 eine "umgekehrte Slice" und könnte auch buchstabiert werden:

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

wenn Sie das für lesbarer halten, wie es viele tun würden.

15
Alex Martelli

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 Swap mit temporärer Speicherung.

6
unwind
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

wenn das letzte Element an Position i größer als Element ist, werden beide getauscht.

0
ravi tanwar

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

Ich bin kein Python-Experte, aber Sie könnten es versuchen: .__ 

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

Beeindruckend! Es gibt viel mehr Standard (anwendbar auf alle Sprachen), einen einfachen und kürzeren Weg!

x = i[2]; i[2] = i[3]; i[3] = x

Einfach ist besser als Komplex 

Hinweis: Wenn Sie die Position nicht kennen:

index = list.index("password1")  # = 3 in the given list
0
Apostolos