Перейти к содержимому

Как отсортировать список в питоне без sort

  • автор:

Как сделать сортировку списка без list.sort()

Думаю Сортировка пузырьком например поможет разобраться в сортировке. Там точно есть конструкция которая вам нужна.

array = [5,7,4,3,8,2] for run in range(len(array)-1): for i in range(len(array)-1): if array[i]>array[i+1]: array[i],array[i+1]= array[i+1],array[i] # ваше хз как 

Отслеживать
ответ дан 10 авг 2022 в 8:50
Zhenia Kviatkivskyi Zhenia Kviatkivskyi
890 6 6 серебряных знаков 10 10 бронзовых знаков
Спасибо за ответ, помогло!
10 авг 2022 в 15:13

# Хз как 
a[j], a[j+1] = [j+1], a[j] 

Отслеживать
ответ дан 9 авг 2022 в 18:28
16.5k 4 4 золотых знака 19 19 серебряных знаков 30 30 бронзовых знаков

Traceback (most recent call last): File «C:\Users\begor\Desktop\Python\1.py», line 55, in a[j], a[j+l] = [j+1], a[j] IndexError: list assignment index out of range

9 авг 2022 в 19:03

@EgorAkaDeer, это ваша ошибка, не моя. Вместо цифры 1 вы написали букву l . Между прочим, не было бы лучше использовать вместо имени l что-то другое?

9 авг 2022 в 21:24

  • python
  • python-3.x
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Сортировка списка по нескольким атрибутам в Python

Сортировка данных — одна из самых распространенных задач в программировании. В Python есть встроенная функция sorted() , которая позволяет сортировать данные по одному атрибуту. Например, представьте, что у вас есть список списков:

data = [[5, 'Алексей', 'синий'], [3, 'Виктор', 'красный'], [7, 'Алексей', 'желтый']]

Можно отсортировать этот список по имени, используя функцию sorted() и itemgetter() из модуля operator :

from operator import itemgetter sorted_data = sorted(data, key=itemgetter(1))

Но что делать, если нужно отсортировать список по нескольким атрибутам, например, по имени и цвету одновременно?

Сортировка по нескольким атрибутам

В Python, функция sorted() может принимать в качестве ключа кортеж. Это означает, что можно отсортировать список по нескольким атрибутам, просто передав их в качестве ключа в виде кортежа. Вернемся к предыдущему примеру и отсортируем его по имени и цвету:

from operator import itemgetter sorted_data = sorted(data, key=itemgetter(1, 2))

Так, список будет сначала отсортирован по имени, а затем, внутри каждой группы с одинаковыми именами, по цвету. Это позволяет очень просто и эффективно сортировать данные по нескольким атрибутам одновременно.

Заключение

В Python, сортировка данных по нескольким атрибутам — это просто и эффективно. Используя функцию sorted() и itemgetter() из модуля operator , можно легко отсортировать список по любому количеству атрибутов, просто передав их в качестве ключа в виде кортежа. Это делает Python мощным инструментом для обработки и анализа данных.

python: упорядочить список чисел без встроенной сортировки, функции min, max

Если у меня есть список, который меняется по длине каждый раз, и я хочу сортировать его от самого низкого до самого высокого, как бы я это сделал? Если у меня есть: [-5, -23, 5, 0, 23, -6, 23, 67] Я хочу: [-23, -6, -5, 0, 5, 23, 23, 67] Начну с этого:

data_list = [-5, -23, 5, 0, 23, -6, 23, 67] new_list = [] minimum = data_list[0] # arbitrary number in list for x in data_list: if x < minimum: minimum = value new_list.append(i) 

НО это только проходит один раз, и я получаю:

new_list = [-23] 

Вот где я застрял. Как мне продолжить цикл до тех пор, пока len(new_list) = len(data_list) (т.е. все числа не будут в новом списке) со всем, отсортированным без использования встроенных функций max, min, sort? Я не уверен, нужно ли создавать новый список.

user1589244 15 авг. 2012, в 08:01
Поделиться

Мне интересно ваши ограничения - почему? Кроме того, в некоторой степени из-за этого - это домашняя работа?

Levon 15 авг. 2012, в 05:18
стандартная сортировка списка?
Andreas Jung 15 авг. 2012, в 05:20

Да, это для веселого класса. Я знаю, что могу сделать это с помощью функции сортировки, но хочу сделать это альтернативным способом.

user1589244 15 авг. 2012, в 05:22

Существует множество способов сортировки, но лишь немногие из них являются эффективными удаленно, и даже использование хорошего алгоритма будет в ~ 100 раз медленнее, чем встроенная сортировка.

John La Rooy 15 авг. 2012, в 05:24

Я не думаю, что цель этого упражнения состоит в том, чтобы быть эффективным, а научиться мучительному / долгому пути.

user1589244 15 авг. 2012, в 05:27

Вы используете несколько переменных ( i и value ), которые, кажется, нигде не определены. Я изменил их в своем ответе

John La Rooy 15 авг. 2012, в 05:36
Показать ещё 4 комментария
Поделиться:

14 ответов

Лучший ответ

Я думаю, вы пытаетесь сделать что-то вроде этого:

data_list = [-5, -23, 5, 0, 23, -6, 23, 67] new_list = [] while data_list: minimum = data_list[0] # arbitrary number in list for x in data_list: if x < minimum: minimum = x new_list.append(minimum) data_list.remove(minimum) print new_list 

John La Rooy 15 авг. 2012, в 05:38
Поделиться

Извините, что беспокою, у меня есть еще один вопрос об этом решении. Это работало, когда я вводил в интерактивном режиме. Я попробовал еще раз, и теперь я получаю сообщение об ошибке: >>> data_list = [-5, -23, 5, 0, 23, -6, 23, 67] >>> new_list = [] >>> while data_list: .. .imum = data_list [0] . для x в data_list: . если x <минимум: . минимум = x . new_list.append (минимум) . data_list.remove (минимум) . Traceback (последний вызов был последним): файл "", строка 7, в ValueError: list.remove (x): x отсутствует в списке >>>

user1589244 15 авг. 2012, в 06:24

@ user1589244, убедитесь, что вы правильно сделали отступ. Вы можете скопировать и вставить его отсюда

John La Rooy 15 авг. 2012, в 06:31

Хотел бы я иметь твой мозг. Да, похоже, что я отступил в new_list.append и data_list.remove с оператором if вместо оператора for, когда я делал это во второй раз. Это должно быть это. Большое спасибо @gnibbler.

user1589244 15 авг. 2012, в 06:34

@gnibbler: Не могли бы вы объяснить цель выражения «while data_list:»? У меня проблемы с выяснением вашего кода. Объяснение было бы потрясающим! Спасибо

Shankar Kumar 11 авг. 2013, в 04:18
@ShankarKumar, когда data_list пуст, while data_list: прекратит цикл
John La Rooy 11 авг. 2013, в 05:03
Показать ещё 3 комментария

Вот что я пытаюсь сделать. (Insertion sort - не лучший способ сортировки, но выполняет работу)

def sort(list): for index in range(1,len(list)): value = list[index] i = index-1 while i>=0: if value < list[i]: list[i+1] = list[i] list[i] = value i -= 1 else: break 

nick 13 сен. 2014, в 19:31
Поделиться

Это строго следует вашим требованиям не использовать sort() , min() , max() , но также использует наилучшую практику Python, не изобретая колесо.

data_list = [-5, -23, 5, 0, 23, -6, 23, 67] import heapq heapq.heapify(data_list) new_list = [] while data_list: new_list.append(heapq.heappop(data_list))) 

Я предлагаю посмотреть в библиотеке Python для heapq.py , чтобы узнать, как это работает. Heapsort - довольно забавный алгоритм сортировки, поскольку он позволяет вам сортировать бесконечный поток, т.е. Вы можете быстро получить наименьший элемент, но также эффективно добавлять новые элементы в сортируемые данные.

Duncan 15 авг. 2012, в 10:01
Поделиться

l = [64, 25, 12, 22, 11, 1,2,44,3,122, 23, 34] for i in range(len(l)): for j in range(i + 1, len(l)): if l[i] > l[j]: l[i], l[j] = l[j], l[i] print l 
[1, 2, 3, 11, 12, 22, 23, 25, 34, 44, 64, 122] 

Naseer-shaik 29 март 2018, в 19:09
Поделиться

попробуйте сортировать список, char имеют код ascii, то же самое можно использовать для сортировки списка char.

aw=[1,2,2,1,1,3,5,342,345,56,2,35,436,6,576,54,76,47,658,8758,87,878] for i in range(aw.__len__()): for j in range(aw.__len__()): if aw[i] < aw[j] :aw[i],aw[j]=aw[j],aw[i] 

Vijay 08 авг. 2017, в 13:22
Поделиться

def bubble_sort(seq): """Inefficiently sort the mutable sequence (list) in place. seq MUST BE A MUTABLE SEQUENCE. As with list.sort() and random.shuffle this does NOT return """ changed = True while changed: changed = False for i in xrange(len(seq) - 1): if seq[i] > seq[i+1]: seq[i], seq[i+1] = seq[i+1], seq[i] changed = True return None if __name__ == "__main__": """Sample usage and simple test suite""" from random import shuffle testset = range(100) testcase = testset[:] # make a copy shuffle(testcase) assert testcase != testset # we've shuffled it bubble_sort(testcase) assert testcase == testset # we've unshuffled it back into a copy 

Joran Beasley 15 авг. 2012, в 06:57
Поделиться
Я еще не научился перемешивать 🙁
user1589244 15 авг. 2012, в 05:23

он просто рандомизирует массив . так что вместо shuffle и всего, что просто передается в вашем списке в функцию tje bubble_sort

Joran Beasley 15 авг. 2012, в 05:25
bubble_sort(data_list);print data_list
Joran Beasley 15 авг. 2012, в 05:26
спасибо, но я не могу использовать bubble_sort либо
user1589244 15 авг. 2012, в 05:29
о хорошо, что вы должны использовать . просто выбор ??
Joran Beasley 15 авг. 2012, в 05:30

хороший вопрос. Теоретически, я хочу сначала найти минимум, добавить его в новый список и каждый #, который будет следующим минимумом (путем итерации по списку или, возможно, с помощью цикла for).

user1589244 15 авг. 2012, в 05:37
Показать ещё 4 комментария

Вы можете сделать это легко с помощью функции min()

'def asc(a): b=[] l=len(a) for i in range(l): x=min(a) b.append(x) a.remove(x) return b print asc([2,5,8,7,44,54,23])' 

Сортировка списка списков или списка кортежей по элементу на заданном индексе

Часто встречаются ситуации, когда имеется список списков или список кортежей и требуется отсортировать весь список по одному из элементов вложенных списков или кортежей. Возможно, стоит задача отсортировать список данных по второму элементу каждого списка или кортежа.

В качестве примера рассмотрим следующие данные:

data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]

Необходимо отсортировать эти списки по второму элементу каждого вложенного списка или кортежа, то есть по числам 2, 5, 8.

Решение

В Python предусмотрена функция sort() , которая позволяет отсортировать список. Однако, в данном случае, просто вызвать эту функцию не получится, поскольку нужно отсортировать по конкретному элементу вложенного списка или кортежа.

Для решения этой задачи в функцию sort() можно передать параметр key , который определяет по какому ключу будет производиться сортировка. В качестве этого ключа можно указать функцию, которая будет применяться к каждому элементу списка перед сортировкой.

В данном случае, в качестве функции можно использовать лямбда-функцию, которая возвращает элемент вложенного списка или кортежа по заданному индексу.

Пример кода для сортировки списка списков:

data = [[1,2,3], [4,5,6], [7,8,9]] data.sort(key=lambda x: x[1])

Пример кода для сортировки списка кортежей:

data = [(1,2,3), (4,5,6), (7,8,9)] data.sort(key=lambda x: x[1])

В обоих случаях результат будет следующим:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

То есть, списки отсортированы по второму элементу каждого вложенного списка или кортежа.

Таким образом, для сортировки списка списков или списка кортежей по элементу на заданном индексе, можно использовать функцию sort() с параметром key , в который передается лямбда-функция, возвращающая элемент вложенного списка или кортежа по заданному индексу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *