Сортировка двумерного массива по 1 элементу

Пытаюсь отсортировать двумерный массив по второму элементу по цифрам от большего к меньшего. Но в ответ получаю какую-то фигню. Оно то работает, то нет. Случайность какая-то. Видимо, я делаю, что-то не так. Пожалуйсто, укажите на мою ошибку и, если это Вас не затруднит, пришлите свой вариант.
Отслеживать
задан 7 янв 2020 в 12:19
Лёня Декарт Лёня Декарт
129 2 2 золотых знака 3 3 серебряных знака 10 10 бронзовых знаков
смотрю и удивляюсь, «хочу отсортировать массив» — massiv=SORTIRUI,SUKA и POKAJI , какое-то страное оно — программирование высокоуровневое
7 янв 2020 в 12:24
Эта фича только показывает? А почему тогда после этого элементы в моем массиве меняются местами?
7 янв 2020 в 12:28
понятия не имею что она делает, я питон первый раз вижу. Просто по названиям функций вижу что это такое
7 янв 2020 в 12:33
Уважаемый Лёня, у меня к вам просьба как-то подбирать лексикон. Это не анимешный форум, все-таки.
7 янв 2020 в 12:40
Причём тут анимешный форум и мой лексикон? Лучше бы вопрос прочитали.
7 янв 2020 в 18:04
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
По-умолчанию сортируются непосредственно сами элементы массива, в вашем случае — массивы. Если сортировать надо по определённому параметру элемента, то необходимо передать в основанный параметр key функцию, возвращающую нужный параметр, в вашем случае — второй элемент массива. Её можно определить как обычную функцию через def либо как лямбда-выражение, как в моём примере.
arr = [['asd', 4], ['fgh', 5], ['jkl', 3]] print(arr) arr.sort(key = lambda x: x[1]) print(arr)
[['asd', 4], ['fgh', 5], ['jkl', 3]] [['jkl', 3], ['asd', 4], ['fgh', 5]]
Отслеживать
ответ дан 7 янв 2020 в 12:54
365 2 2 серебряных знака 11 11 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как сделать сортировку двумерного массива javascript
Для сортировки двумерного массива «в лоб» можно использовать следующий алгоритм: в цикле перебирать элементы массива, и к каждому применять метод sort() с функцией сортировки, например по возрастанию:
const array = [[3,4,2,1],[5,67,7,3,3,54,1],[4,76,2,45,4,87]]; for (let i = 0; i array.length; i +=1) array[i].sort((a, b) => a - b) > console.log(array) // Вывод: [ [ 1, 2, 3, 4 ], [ 1, 3, 3, 5, 7, 54, 67 ], [ 2, 4, 4, 45, 76, 87 ] ]
05 апреля 2023
В зависимости от деталей сортировки, решение может быть различным. Например, можно отсортировать двумерный массив по длинне элементов, содержащихся в каждом массиве:
const arr = [ [3, 4, 5, 6], [1, 2], [7, 8, 9, 10, 11, 12, 13, 14, 15], ]; const sortedArr = arr.sort((arr1, arr2) => arr1.length - arr2.length); console.log(sortedArr);
// Получим результат: /* [ [1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15], ]; */
Сортировка двумерного массива в питоне
Ребят, есть такой массив [(35, 1), (37, 1), (118, 1), (36, 1), (23, 1), (29, 1), (31, 3), (21, 4), (18, 4), (20, 6), (19, 17)] . Я его отсортировал по второму столбцу, но как мне отсортировать по первому? что бы было по убыванию и первая сотртировка сохранилась? никак не могу додуматься
Голосование за лучший ответ
надо наоборот. сначала отсортировать по первому, а потом по второму
lst = [(35, 1), (37, 1), (118, 1), (36, 1), (23, 1), (29, 1), (31, 3), (21, 4), (18, 4), (20, 6), (19, 17)]
lst.sort(key = lambda x: x[0], reverse = True)
lst.sort(key = lambda x: x[1])
print(lst)
——
[(118, 1), (37, 1), (36, 1), (35, 1), (29, 1), (23, 1), (31, 3), (21, 4), (18, 4), (20, 6), (19, 17)]
Кирилл КузнецовЗнаток (413) 3 года назад
Большое спасибо!
A = [(35, 1), (37, 1), (118, 1), (36, 1), (23, 1), (29, 1), (31, 3), (21, 4), (18, 4), (20, 6), (19, 17)]
print(sorted(sorted(A, key=lambda x: x[0], reverse=True), key=lambda x: x[1]))
lst = [(35, 1), (37, 1), (118, 1), (36, 1), (23, 1), (29, 1), (31, 3), (21, 4), (18, 4), (20, 6), (19, 17)]
lst.sort(key=lambda x:(x[1], -x[0]))
Программирование в «Эврике»
Теперь мы можем присваивать каждому элементу списка A новое значение. Например, мы можем сделать элемент A[0] также равным списку:
A[0]=range[3]
Теперь A будет равно [[0, 1, 2], 1, 2, 3, 4] , то есть объект A[0] будет списком [0, 1, 2] . В свою очередь, мы можем обращаться к отдельным элементам списка A[0] : A[0][0]==0 , A[0][1]==1 , A[0][2]==2 .
На практике часто приходится иметь дело с прямоугольными таблицами данных, также называемых двумерными массивами. Их можно представлять в виде списка из n элементов (строк), каждый из которых является списком из m элементов (столбцов). Тогда к отдельному элементу двумерного массива A можн обращаться, как A[i][j] , где i является номером строки, 0
Итак, создадим массив A из n=3 строк и m=5 столбцов:
n=3 m=5 A=range(n) # A является списком из n строк for i in range(n): A[i]=range(m) # Каждая строка является списком из m элементов
Заполнение массива
Теперь заполним массив нулями. Для этого нам понадобится два вложенных цикла: внешний цикл по всем строкам, а внутренний – по всем столбцам.
for i in range(n): for j in range(m): A[i][j]=0
Если мы захотим записать в массив таблицу умножения, присвоив элементу A[i][j] значение i*j , последнюю строку в этом примере нужно записать в виде A[i][j]=i*j .
Вывод массива на экран
Конечно, можно вывести массив A на экран одной командой print A , но тогда все элементы будут выведены в одну строку:
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]
Но можно вывести массив в виде таблицы, так, чтобы каждая строка массива была выведена на одной строке, а внутри строки числа разделялись одним пробелом, то есть в виде:
A[0][0] A[0][1] A[0][2] A[0][3] A[0][4] A[1][0] A[1][1] A[1][2] A[1][3] A[1][4] A[2][0] A[2][1] A[2][2] A[2][3] A[2][4]
Для этого снова понадобятся два вложенных цикла. Один цикл по всем строкам, другой – по всем столбцам. В результате получаем:
for i in range(n): for j in range(m): print A[i][j], print
Обратите внимание на запятую, поставленную после инструкции print A[i][j] , необходимую для того, чтобы печать продолжалась на этой же строке. А вот инструкцию print без параметров для перехода на новую строку мы даем после завершения внутреннего цикла, то есть после вывода всей строки на экран. Вот что получится:
0 0 0 0 0 0 1 2 3 4 0 2 4 6 8
Считывание с клавиатуры
Теперь рассмотрим проблему считывания массива с клавиатуры в таком же виде. Проблема заключается в том, что функция input позволяет считать только одно значение, записанное в строке и выдаст ошибку при считывании набора чисел, разделенных пробелами. А функция raw_input сможет считать строку как единое целое вместе со всеми пробелами. Разбить строку на отдельные выражения, разделенные пробелами можно при помощи метода split() . Этот метод применяется к строке и возвращает список подстрок, состоящих из непробельных символов и разделенных пробелами. То есть если применить метод split к строке ‘1 2 3’ , то получится список из 3 строк: [‘1’, ‘2’, ‘3’] . Таким образом, мы можем разбить каждую входную строку на отдельные подстроки, а затем преобразовать эти подстроки к числовому виду при помощи функции int . В результате получаем следующий код (предполагается, что массив A из n строк и m столбцов уже создан):
for i in range(n): # Цикл по всем строкам s=raw_input() # Считали строку в переменную s s=s.split() # Разбили s на слова и записали их в виде списка for j in range(m): A[i][j]=int(s[j]) # Элементу A[i][j] присваиваем значение s[j]
Общий пример программы
Теперь объединим это все в одну программу, которая считывает с клавиатуры числа n и m (заданные в одной строке), затем создает массив из n строк и m столбцов, затем считывает его с клавиатуры построчно, затем увеличивает каждый элемент массива на 1, наконец, печатает результат:
# Считываем размеры массива s=raw_input() s=s.split() n=int(s[0]) m=int(s[1]) # Создаем массив A=range(n) for i in range(n): A[i]=range(m) # Считываем массив с клавиатуры for i in range(n): s=raw_input() s=s.split() for j in range(m): A[i][j]=int(s[j]) # Увеличиваем все элементы на 1 for i in range(n): for j in range(m): A[i][j]=A[i][j]+1 # Выводим массив на экран for i in range(n): for j in range(m): print A[i][j], print
Сложный пример обработки массива
Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали проходящей из левого верхнего угла в правый нижний (то есть тем элементам A[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4 ):
1 0 0 0 2 1 0 0 2 2 1 0 2 2 2 1
Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы A[i][j] , для которых ij . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:
for i in range(n): for j in range(n): if ij: A[i][j]=2 else: A[i][j]=1
Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.
Сначала заполним главную диагональ, для чего нам понадобится один цикл:
for i in range(n): A[i][i]=1
Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам A[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:
for i in range(n): for j in range(i+1,n): A[i][j]=0
Аналогично присваиваем значение 2 элементам A[i][j] для j = 0 , . i-1 :
for i in range(n): for j in range(0,i): A[i][j]=2
Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:
for i in range(n): for j in range(0,i): A[i][j]=2 A[i][i]=1 for j in range(i+1,n): A[i][j]=0
Форматирование чисел при выводе
Допустим, мы заполним массив таблицей умножения: A[i][j]=i*j как в примере в начале раздела. Если мы теперь попробуем вывести этот массив на экран, разделяя элементы в строке одним пробелом, то из-за того, что числа имеют различную длину столбцы таблицы окажутся неровными:
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27
Для того, чтобы получить ровные столбцы необходимо, выводить числа так, чтобы одно выводимое число имело длину, например, ровно в 2 символа, а «лишние» позиции были бы заполнены пробелами.
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27
Без лишних комментариев покажем, как в программе указать, что целое число x нужно выводить так, чтобы оно занимало ровно две позиции: print «%2d» % x . Здесь, естественно, можно заменить значение x на то значение, которое необходимо напечатать, а число 2 на любую другую ширину поля.
Итак, для печати ровной таблицы умножения можно воспользоваться следующим кодом:
for i in range(n): for j in range(m): print «%2d» % A[i][j],