Подтвердить что ты не робот

Как отсортировать массив 2d по строке в python?

У меня есть 2d-массив, размер 3x10, и я хочу сортировать по значениям во 2-й строке, от самого низкого до самого высокого значения, любой полезный отзыв?

4b9b3361

Ответ 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 меняются на противоположные, так как целью было сортировать значения выше и ниже.