Reordenar la lista de Python

Tengo una lista de 4 artículos como este:

a, b, c, d = [1, 2, 3, 4] 

Estoy reordenando la lista, volteando cada par:

 [b, a, d, c] 

¿Hay una manera de hacer esto en una expresión? He intentado usar la comprensión de listas y desempaquetar, pero parece que no puedo hacerlo bien.

Tengo [1, 2, 3, 4]. Estoy tratando de obtener [2, 1, 4, 3].

Más genéricamente, si buscas voltear pares de números en una lista:

 >>> L = [1, 2, 3, 4, 5, 6] >>> from itertools import chain >>> list(chain.from_iterable(zip(L[1::2], L[::2]))) [2, 1, 4, 3, 6, 5] 

Mira esto:

 >>> lst = [1, 2, 3, 4] >>> [y for x in zip(*[iter(lst)]*2) for y in x[::-1]] [2, 1, 4, 3] >>> >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> [y for x in zip(*[iter(lst)]*2) for y in x[::-1]] [2, 1, 4, 3, 6, 5, 8, 7, 10, 9] >>> 

Si esto es solo alrededor de 4 listas de miembros, esto sería suficiente:

 list = [1, 2, 3, 4] reordered_list = [list[1], list[0], list[3],list[2]] 

Porque absolutamente nadie ha dado una respuesta que funcione en iterables generics,

 from itertools import chain items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] zip(*[iter(items)]*2) #>>>  [itms for itms in zip(*[iter(items)]*2)] #>>> [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)] 

Así que zip(*[iter(x)]*2) significa ix = iter(x); zip(ix, ix) ix = iter(x); zip(ix, ix) que empareja cada elemento.

Entonces puedes revertir:

 [(y, x) for (x, y) in zip(*[iter(items)]*2)] #>>> [(2, 1), (4, 3), (6, 5), (8, 7), (10, 9)] 

Poniendo todo junto y aplanando:

 [itm for (x, y) in zip(*[iter(items)]*2) for itm in (y, x)] #>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9] 

¡Es genérico y corto!


Si desea algo más rápido a expensas del genérico, le será muy difícil mejorar esto:

 new = list(items) new[::2], new[1::2] = new[1::2], new[::2] new #>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9] 

Tenga en cuenta que esto todavía funciona en iterables arbitrarios, pero hay menos capas de abstracción; no puede boost el tamaño de las sub-listas volteadas tan fácilmente y no puede generar resultados, etc.

Quieres decir esto:

 >>> a, b, c, d = [1, 2, 3, 4] >>> b, a, d, c = a, b, c, d >>> a 2 >>> b 1 >>> c 4 >>> d 3 

?

Pruebe esta solución de la lista de comprensión:

 a = [1,2,3,4,5,6] # Any list with even number of elements b = [a[e+1] if (e%2 == 0) else a[e-1] for e in range(len(a))] 

Esto solo funciona si la lista tiene un número par de elementos.

 In [1]: l = [1, 2, 3, 4] In [2]: list(chain(*map(reversed, zip(l[::2], l[1::2])))) Out[2]: [2, 1, 4, 3] 

¿Me estoy perdiendo de algo? Reordenar given_list con un bucle:

 rez = [] for i in range(len(given_list)-1, -1, -1): rez.append(given_list[i]) return rez