У меня есть 2d-массив, размер 3x10, и я хочу сортировать по значениям во 2-й строке, от самого низкого до самого высокого значения, любой полезный отзыв?
Как отсортировать массив 2d по строке в python?
Ответ 1
Python сам по себе не имеет "2d-массива" - он имеет (1d) списки как встроенные и массивы (1d) в стандартном библиотечном модуле array. Существуют сторонние библиотеки, такие как numpy
, которые предоставляют многомерные массивы на основе Python, но, конечно, вы бы упомянули такие сторонние библиотеки, если вы использовали некоторые из них, вместо того, чтобы просто говорить "в Python", справа? -)
Итак, я предполагаю, что под "2d array" вы имеете в виду список списков, например:
lol = [ range(10), range(2, 12), range(5, 15) ]
или тому подобное, т.е. список из 3 элементов, каждый из которых представляет собой список из 10 элементов, а "вторая строка" будет элементом подписок lol[1]
. Да, много предположений, но ваш вопрос настолько безумно туманен, что нет способа избежать предположений - отредактируйте свой Q, чтобы уточнить с большей точностью и примером!, если вам не нравятся люди, пытающиеся читать ваши мысли (и, вероятно, не удается) как вы в настоящее время не можете избежать.
Таким образом, в этих предположениях вы можете отсортировать каждый из 3 подписок в порядке, необходимом для сортировки второго, например:
indices = range(10)
indices.sort(key = lol[1].__getitem__)
for i, sublist in enumerate(lol):
lol[i] = [sublist[j] for j in indices]
Общий подход здесь состоит в том, чтобы отсортировать диапазон индексов, а затем просто использовать подходящий отсортированный диапазон для изменения порядка всех подписок в игре.
Если у вас есть другая проблема, то, конечно, будут разные решения: -).
Ответ 2
Как выглядит ваш "2D-массив"?
Например:
>>> 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]]
Но я думаю, вы хотите что-то вроде этого:
>>> 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)
]
Ответ 3
Вместо использования lambda x: x[1]
вы можете использовать operator.itemgetter как ключ к сортировке или отсортированным функциям. itemgetter (n) создает функцию, которая получает n-й элемент из списка.
>>> 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]]
Ответ 4
Хорошо, если вы говорите о стандартных списках python, это легко: mylist[1].sort()
. Например:
>>> 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]]
Ответ 5
Это небольшая функция, которую я написал для этой цели:
def sorted_table(data, column=0, reverse=False):
return sorted(data, cmp=lambda a,b: cmp(a[column], b[column]), reverse=reverse)
На самом деле, у меня было несколько более сложное требование, которое должно сортировать таблицу по двум столбцам. Оказывается, что функция cmp()
весьма разносторонняя; это моя оригинальная функция:
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
В первом случае значения b и a меняются на противоположные, так как целью было сортировать значения выше и ниже.