web-dev-qa-db-fra.com

Comment trier un tableau multidimensionnel par colonne?

Est-il possible d'utiliser la méthode sort () ou une autre méthode pour trier une liste par colonne? Disons que j'ai la liste:

[
[John,2],
[Jim,9],
[Jason,1]
]

Et je voulais le trier pour qu'il ressemble à ceci:

[
[Jason,1],
[John,2],
[Jim,9],
]

Quelle serait la meilleure approche pour faire cela?

Modifier:

En ce moment, je rencontre une erreur d’index hors de portée. J'ai un tableau en 2 dimensions qui est disons 1000 lignes b 3 colonnes. Je veux le trier sur la troisième colonne. Est-ce le bon code pour cela?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2])
31
Web Hopeful

Oui. Le sorted intégré accepte un argument key:

sorted(li,key=lambda x: x[1])
Out[31]: [['Jason', 1], ['John', 2], ['Jim', 9]]

notez que sorted renvoie une nouvelle liste. Si vous voulez trier sur place, utilisez le .sort méthode de votre liste (qui accepte également, de manière pratique, un argument key).

ou bien,

from operator import itemgetter
sorted(li,key=itemgetter(1))
Out[33]: [['Jason', 1], ['John', 2], ['Jim', 9]]

En savoir plus sur le python wiki .

39
roippi

Vous pouvez utiliser la méthode triée avec une clé.

sorted(a, key=lambda x : x[1])
8
squiguy

Vous pouvez utiliser list.sort avec son paramètre facultatif key paramètre et a lambda expression :

>>> lst = [
...     ['John',2],
...     ['Jim',9],
...     ['Jason',1]
... ]
>>> lst.sort(key=lambda x:x[1])
>>> lst
[['Jason', 1], ['John', 2], ['Jim', 9]]
>>>

Cela va trier la liste sur place.


Notez que pour les grandes listes, il sera plus rapide d’utiliser operator.itemgetter au lieu d'un lambda:

>>> from operator import itemgetter
>>> lst = [
...     ['John',2],
...     ['Jim',9],
...     ['Jason',1]
... ]
>>> lst.sort(key=itemgetter(1))
>>> lst
[['Jason', 1], ['John', 2], ['Jim', 9]]
>>>
2
iCodez
sorted(list, key=lambda x: x[1])

Note: cela fonctionne aussi sur la variable de temps.

1
kevin

Le paramètre facultatif key de sort/sorted est une fonction. La fonction est appelée pour chaque article et les valeurs de retour déterminent l'ordre du tri.

>>> lst = [['John', 2], ['Jim', 9], ['Jason', 1]]
>>> def my_key_func(item):
...     print("The key for {} is {}".format(item, item[1]))
...     return item[1]
... 
>>> sorted(lst, key=my_key_func)
The key for ['John', 2] is 2
The key for ['Jim', 9] is 9
The key for ['Jason', 1] is 1
[['Jason', 1], ['John', 2], ['Jim', 9]]

prendre le print des feuilles de fonction

>>> def my_key_func(item):
...     return item[1]

Cette fonction est assez simple pour écrire "inline" en tant que fonction lambda

>>> sorted(lst, key=lambda item: item[1])
[['Jason', 1], ['John', 2], ['Jim', 9]]
1
John La Rooy