2010-03-22 24 views
122

No he podido encontrar una buena solución para este problema en la red (probablemente porque el cambio, la posición, la lista y Python son todas esas palabras sobrecargadas).¿Cómo cambiar la posición de dos elementos en una lista de Python?

Es bastante simple - Tengo esta lista:

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

me gustaría cambiar la posición de 'password2' y 'password1' - sin saber su posición exacta, sólo que están justo al lado de uno al otro y password2 es primero.

He logrado esto con algunos subíndices de listas bastante prolijas, pero me preguntaba si sería posible encontrar algo un poco más elegante.

+0

¿Su problema es la eficacia de tratar de encontrar 'contraseña2' en la lista? ¿Puede 'contraseña1' venir antes 'contraseña2'? ¿Hay alguna complejidad aquí que no aparezca en tu pregunta original? De lo contrario, estoy de acuerdo con @unwind. –

+3

Deberías publicar lo que tienes. Tengo curiosidad por saber a qué te refieres con una "sub-lista de listas bastante prolija". – samtregar

+0

Algo parecido a index1 = index ('password1'); index2 = index ('password2'); order = order [: index2] .append (order [index1]). append (order [index2]) append (order [index1 + 1:]); extender en algunas líneas más. Bastante, no. – mikl

Respuesta

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

¿Cómo puede ser nunca mayor que

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

Eso es sólo un intercambio simple usando el almacenamiento temporal.

+6

Si quieres ser realmente "Ptónico" al respecto, siempre puedes hacer esto: 'mi_lista [indexOfPwd2], mi_lista [indexOfPwd2 + 1] = mi_lista [indexOfPwd2 + 1], mi_lista [indexOfPwd2]' –

104

El intercambio simple de Python tiene el siguiente aspecto:

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

Ahora todo lo que necesita hacer es figura de lo i es, y que se puede hacer fácilmente con index:

i = foo.index("password2") 
13

Dadas sus especificaciones, utilizaría la asignación de sectores:

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

El lado derecho de la asignación de la rebanada es una "rebanada invertido" y también podría escribirse:

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

si encuentra que más legible, como muchos lo harían.

+0

¿Por qué esto no es así? trabajando si quieres cambiar el título y el correo, el primer elemento con el segundo? –

+0

Lo siento, ahora entiendo, no hay elementos en i-1, por lo que se devuelve una lista vacía –

0

puede utilizar por ejemplo:

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

no soy un experto en Python, pero usted podría intentar: dicen

i = (1,2) 

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

anterior daría O/P como:

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

Eso no funciona sin conocer la posición de las teclas para intercambiar. – mikl

Cuestiones relacionadas