web-dev-qa-db-fra.com

Comment trier 2d tableau par ligne en python?

J'ai 2d tableau, dimension 3x10, et je veux trier par valeurs dans la 2ème ligne, du plus bas au plus élevé.

15
user257522

Python, en soi, n'a pas de "tableau 2d" - il a (1d) des listes comme éléments intégrés, et (1d) des tableaux dans le module de bibliothèque standard array . Il existe des bibliothèques tierces telles que numpy qui fournissent des tableaux multidimensionnels utilisables par Python, mais vous feriez bien sûr mention de ces bibliothèques tierces si vous en utilisiez certaines, plutôt que de simplement dire "en Python", right ? -)

Je suppose donc que par "tableau 2d", vous entendez une liste de listes, telles que:

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

ou similaire - c'est-à-dire une liste de 3 éléments, chaque élément étant une liste de 10 éléments et la "deuxième ligne" étant l'élément de sous-liste lol[1]. Oui, beaucoup d'hypothèses, mais votre question est tellement vague qu'il n'y a aucun moyen d'éviter de faire des hypothèses - modifiez votre Q pour le clarifier, et donnez un exemple !, si vous n'aimez pas les gens qui essaient de lire dans votre esprit (et qui échouent probablement) comme vous le rendez actuellement impossible à éviter.

Ainsi, sous ces hypothèses, vous pouvez trier chacune des 3 sous-listes dans l'ordre requis pour trier la seconde, par exemple:

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

L'approche générale consiste à trier la plage d'index, puis à utiliser cette plage correctement triée pour réorganiser toutes les sous-listes en cours.

Si vous avez réellement un problème différent, il y aura bien sûr des solutions différentes ;-).

19
Alex Martelli

A quoi ressemble votre "tableau 2D"?

Par exemple:

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

Mais je suppose que vous voulez quelque chose comme ça:

>>> 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)
]
28
Messa

Plutôt que d'utiliser lambda x: x[1], vous pouvez utiliser operator.itemgetter comme clé des fonctions de tri ou de tri. itemgetter (n) crée une fonction qui extrait le nième élément d'une liste.

>>> 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]]
6
Dave Kirby

Eh bien, si vous parlez de listes Python standard, c’est simple: mylist[1].sort(). Par exemple:

>>> 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]]
1
Daniel G

C'est une petite fonction que j'ai écrite à cet effet:

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

En fait, j'avais une exigence un peu plus complexe, qui consiste à trier le tableau en deux colonnes. Il s’avère que la fonction cmp() est assez polyvalente; c'est ma fonction d'origine:

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

Les b et a sont inversés dans le premier cas, puisque l’objectif était de trier les valeurs les plus hautes vers les plus basses.

0
Berislav Lopac