2013-11-25 4 views
15

Есть ли способ использовать метод sort() или любой другой способ сортировки списка по столбцу? Допустим, у меня есть список:Как отсортировать многомерный массив по столбцу?

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

И я хотел, чтобы отсортировать его так, что он будет выглядеть следующим образом:

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

Что бы быть лучшим подходом, чтобы сделать это?

Edit:

Сейчас я бегу в индекс из ошибок диапазона. У меня есть 2-мерный массив, который позволяет сказать 1000 строк b 3 столбца. Я хочу сортировать его на основе третьего столбца. Это правильный код для этого?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2]) 
+0

см. Http: // stackoverflow.com/questions/2828059/sorting-arrays-in-numpy-by-column – duhaime

+0

Прямо сейчас я столкнулся с ошибкой индекса вне диапазона. У меня есть 2-мерный массив, который позволяет сказать 1000 строк b 3 столбца. Я хочу сортировать его на основе третьего столбца. Это правильный код для этого? sorted_list = sorted (list_not_sorted, key = lambda x: x [2]) –

+0

В ответ на ваше редактирование, поскольку списки нулевые индексируются, да x [2] - это третий столбец. Мораль этой истории заключается в том, что вы можете использовать ключ и лямбду или фактическую функцию для сортировки по некоторым условиям в 'sorted' и' sort'. – squiguy

ответ

22

Да. sorted встроенные принимает key аргумента:

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

отмечает, что sorted возвращает новый список. Если вы хотите сортировать на месте, используйте метод .sort вашего списка (который также удобно принимает аргумент key).

или в качестве альтернативы,

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

Read more on the python wiki.

+0

Можете упомянуть, что это вернет новый список. – iCodez

+1

Действительно. Если вы хотите изменить исходный список, это будет 'li.sort (key = whatever)'. – user2357112

6

Вы можете использовать отсортированный метод с ключом.

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

Вы можете использовать list.sort с его необязательным key parameter и lambda expression:

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

Это сортирует список на месте.


Обратите внимание, что для больших списков, будет быстрее использовать operator.itemgetter вместо lambda:

>>> from operator import itemgetter 
>>> lst = [ 
...  ['John',2], 
...  ['Jim',9], 
...  ['Jason',1] 
... ] 
>>> lst.sort(key=itemgetter(1)) 
>>> lst 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
>>> 
+0

Что такое «лямбда»? –

+0

@ user3024130 - 'lambda' создает встроенную функцию для параметра' key'. Я добавил ссылку, чтобы лучше объяснить. Использование 'lambda' не будет отличаться от выполнения' def func (x): return x [1] ', а затем' lst.sort (key = func) '. – iCodez

+0

Хорошо, что имеет смысл. Как бы вы сортировали его от наивысшего до самого низкого, а не от самого низкого до самого высокого? –

0

Дополнительный key параметр sort/sorted является функцией. Эта функция вызывается для каждого элемента и возвращаемые значения определяют порядок сортировки

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

принимая на print из функции листьев

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

Эта функция достаточно просто написать «инлайн», как функция лямбда

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

Примечание: это работает на временной переменной слишком.

Смежные вопросы