2010-01-31 17 views

Respuesta

19

Python, per se, no tiene "matriz 2D" - tiene listas (1d) como muebles empotrados, y matrices (1d) en el módulo de biblioteca estándar array. Hay bibliotecas de terceros como numpy que proporcionan matrices multidimensionales utilizables en Python, pero por supuesto mencionarías esas bibliotecas de terceros si estuvieras usando algunas de ellas, en lugar de solo decir "en Python", ? derecho -)

Así que voy a suponer que por "matriz 2D" se refiere a una lista de listas, tales como:

lol = [ range(10), range(2, 12), range(5, 15) ] 

o similares - es decir, una lista con 3 elementos, cada uno el elemento es una lista con 10 elementos, y la "segunda fila" sería la sublista elemento lol[1]. Sí, muchas suposiciones, pero tu pregunta es tan enloquecedoramente vaga que no hay forma de evitar hacer suposiciones: edita tu Q para aclarar con más precisión y, por ejemplo, si no te gusta la gente que intenta leer tu mente (y probablemente fallando) como actualmente lo hacen imposible de evitar.

Así, bajo estas premisas se puede ordenar cada una de las 3 sublistas en el orden requerido para ordenar la segunda, por ejemplo:

indices = range(10) 
indices.sort(key = lol[1].__getitem__) 
for i, sublist in enumerate(lol): 
    lol[i] = [sublist[j] for j in indices] 

El enfoque general aquí es para ordenar la gama de índices, a continuación, sólo use ese rango apropiadamente ordenado para reordenar todas las sublistas en juego.

Si realmente tiene un problema diferente, habrá, por supuesto, soluciones diferentes ;-).

+0

gracias, usted es realmente buen lector de la mente :)))), en el futuro voy a ser más descriptivo y determinado ..mi "pregunta real" fue sobre ordenar sublistas en el orden requerido para el 2º – user257522

0

Bueno, si estás hablando de listas de python estándar, esto es fácil: mylist[1].sort(). Por ejemplo:

>>> from random import randint 
>>> a_list = [[randint(1,15) for _ in range(10)] for _ in range(3)] 
>>> print a_list 
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 8, 7, 4, 6, 11, 15, 12, 4, 6], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]] 
>>> a_list[1].sort() 
>>> print a_list 
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 4, 4, 6, 6, 7, 8, 11, 12, 15], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]] 
26

¿Cómo es su "matriz 2D"?

Por ejemplo:

>>> a = [ 
    [12, 18, 6, 3], 
    [ 4, 3, 1, 2], 
    [15, 8, 9, 6] 
] 
>>> a.sort(key=lambda x: x[1]) 
>>> a 
[[4, 3, 1, 2], 
[15, 8, 9, 6], 
[12, 18, 6, 3]] 

Pero supongo que usted quiere algo como esto:

>>> a = [ 
    [12, 18, 6, 3], 
    [ 4, 3, 1, 2], 
    [15, 8, 9, 6] 
] 
>>> a = zip(*a) 
>>> a.sort(key=lambda x: x[1]) 
>>> a 
[(6, 1, 9), 
(3, 2, 6), 
(18, 3, 8), 
(12, 4, 15)] 
>>> a = zip(*a) 
>>> a 
[(6, 3, 18, 12), 
(1, 2, 3, 4), 
(9, 6, 8, 15) 
] 
+1

considerar usar 'itemgetter (1)' en lugar de 'lambda' –

6

En lugar de utilizar lambda x: x[1] puede utilizar operator.itemgetter como la clave para el tipo o funciones ordenados. itemgetter (n) crea una función que obtiene el enésimo elemento de una lista.

>>> matrix = [ [4,5,6], [1,2,3], [7,0,9]] 
>>> from operator import itemgetter 
>>> sorted(matrix, key=itemgetter(1)) 
[[7, 0, 9], [1, 2, 3], [4, 5, 6]] 
0

Ésta es una pequeña función que escribí para este propósito:

def sorted_table(data, column=0, reverse=False): 
    return sorted(data, cmp=lambda a,b: cmp(a[column], b[column]), reverse=reverse) 

En realidad, tuve requisito un poco más complejo, que consiste en ordenar la tabla por dos columnas. Resulta que la función cmp() es bastante versátil; este es mi función original:

def sort_report(data): 
    """Sort report columns: first by value, then by label.""" 
    return sorted(data, cmp=lambda a,b: cmp(b[2], a[2]) or cmp(a[0], b[0])) # label is column 0; value is column 2 

El bya se invierten en el primer caso, ya que el objetivo era ordenar los valores más altos lado a otro para bajar.