¿Cómo puedo reordenar una lista? [cerrado]

108

Si tengo una lista, [a,b,c,d,e]¿cómo puedo reordenar los artículos de manera arbitraria [d,c,a,b,e]?

Editar: no quiero mezclarlos. Quiero reordenarlos de una manera predefinida. (por ejemplo, sé que el tercer elemento de la lista anterior debería convertirse en el primer elemento de la nueva lista)

Niyaz
fuente
Probablemente duplicado de stackoverflow.com/questions/976882/…
kgiannakakis
4
Sin especificar cómo desea ordenar los elementos, es difícil responder. ¿Quieres ordenarlos? ¿Barajarlos? ¿Eliminar algunos de ellos?
Mizipzor
@tvanfosson: En este caso, arbitrario también podría significar: tomar una función de clasificación arbitraria (pero bien definida).
Felix Kling
1
@mizipzor Quiero reordenarlos de una manera predefinida. (Editó la pregunta para aclarar esto)
Niyaz
@SilentGhost Tendrá un nuevo índice. Puede ser 4. El punto es que conozco el nuevo orden de los artículos.
Niyaz

Respuestas:

226

Puedes hacerlo así

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']
AJ.
fuente
1
Esto crea una nueva variable. ¿Cómo reordenar una lista en el lugar? Gracias
Confundido el
@Confounded Simplemente cambie la línea final a:mylist[:] = [mylist[i] for i in myorder]
Adam
13
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
SilentGhost
fuente
1
Simplemente no pude entender la sintaxis hasta que me di cuenta de que es una asignación simultánea por pares . ´ :-)
loves.by.Jesus
11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
marca
fuente
@ wenlibin02, simplemente lo ejecuté bajo 2.7.5 y todavía funciona bien. ¿Obtienes algún tipo de error?
Mark
sin error, solo escribo: 1) importar al azar; x = [1, 2, 3]; aleatorio.shuffle (x); # devuelve Ninguno; y 2) Probé np.random.shuffle. Los resultados son los mismos.
Libin Wen
¡Oh, lo siento! No me di cuenta de que cambio directamente el valor de x. Devolvió Ninguno. Y funciona. Gracias.
Libin Wen
6

¿El orden final está definido por una lista de índices?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

editar: meh. AJ fue más rápido ... ¿Cómo puedo reordenar una lista en Python?

Raphaël Saint-Pierre
fuente
3
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']
ghostdog74
fuente
2

Puede proporcionar su propia función de clasificación para list.sort():

El método sort () toma argumentos opcionales para controlar las comparaciones.

  • cmp especifica una función de comparación costumbre de dos argumentos (artículos de la lista) que debe devolver un negativo, cero o número positivo dependiendo de si el primer argumento se considera menor que, igual a, o mayor que el segundo argumento: cmp=lambda x,y: cmp(x.lower(), y.lower()). El valor predeterminado es None.

  • clave especifica una función de un argumento que se utiliza para extraer una clave de comparación de cada elemento de la lista: key=str.lower. El valor predeterminado es None.

  • reverse es un valor booleano. Si se establece en Verdadero, los elementos de la lista se ordenan como si se invirtiera cada comparación.

En general, los procesos de conversión clave e inversa son mucho más rápidos que especificar una función cmp equivalente. Esto se debe a que cmp se llama varias veces para cada elemento de la lista, mientras que la tecla y el reverso tocan cada elemento solo una vez.

Felix Kling
fuente
2
y ¿cómo implementarías esto exactamente?
SilentGhost
@SilentGhost: Esto es una respuesta general. En el caso de los PO, su respuesta es más apropiada. No obstante, creo que es importante saber que existe una solución genérica.
Felix Kling
2

Si usa numpy, hay una manera ordenada de hacerlo:

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

Este código devuelve:

[1 3 2 0]
['b' 'd' 'c' 'a']
usuario2228129
fuente
1
OP busca un reordenamiento específico, no un barajado genérico.
Teepeemm
2

Si no le importa tanto la eficiencia, puede confiar en la indexación de matrices de numpy para que sea elegante:

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )
Shaohua Li
fuente
1

Por lo que entiendo de su pregunta, parece que desea aplicar una permutación que especifique en un list. Esto se hace especificando otro list(llamémoslo p) que contiene los índices de los elementos del original listque deberían aparecer en el permutado list. Luego, usa ppara hacer un nuevo listsimplemente sustituyendo el elemento en cada posición por aquel cuyo índice está en esa posición en p.

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

Esto imprime ['d', 'c', 'a', 'b', 'e'].

En realidad, esto crea un nuevo list, pero puede modificarse trivialmente para permutar el original "en su lugar".

MAK
fuente
1

Una cosa más que se puede considerar es la otra interpretación señalada por darkless

Código en Python 2.7

Principalmente:

  1. Reordenar por valor - Ya resuelto por AJ arriba
  2. Reordenar por índice

    mylist = ['a', 'b', 'c', 'd', 'e']
    myorder = [3, 2, 0, 1, 4]
    
    mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
    print [item[0] for item in mylist]

Esto imprimirá ['c', 'd', 'b', 'a', 'e']

Kshitij Satpute
fuente
0
newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])
inspectorG4dget
fuente
-1

Esto es lo que usé cuando me encontré con este problema.

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: para las letras minúsculas

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

Simplemente cambia la lista a un índice específico

AA Ron
fuente