Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708

Сортировка списка по ключу

29.07.2020, 19:44. Показов 11067. Ответов 16

Студворк — интернет-сервис помощи студентам
В случае сортировки списка по ключу при заданной функции:
Python
1
2
3
4
5
6
7
8
>>> help(sorted)
Help on built-in function sorted in module builtins:
 
sorted(iterable, /, *, key=None, reverse=False)
    Return a new list containing all items from the iterable in ascending order.
 
    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.
Алгоритм итерирования по элементам списка? Функция вызывается на каждом элементе до сравнения и не применяется для изменения элементов объекта, какие функции, методы и приемы применимы при изменении объектов при сортировке, кроме генераторов списка, какие обычно применяются модули(функции), например при использовании библиотеки pandas или numpy? И пожалуйста примеры, очень сложно что-то понять без примеров.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.07.2020, 19:44
Ответы с готовыми решениями:

Сортировка списка словарей по ключу
Всем привет! Помогите решить задачку. Есть список словарей: list_of_elements = Нужно отсортировать его, чтобы...

Словари / удаление элемента из списка по ключу
Имеется словарь: a = {1: } Как удалить "two"?

Сортировка данных в файле по ключу
Без сериализации в json как то можно отсортировать данные в файле по ключу date: {"name": "name_1", "date":...

16
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.07.2020, 20:01
AlexMarkov, key, это параметр, в качестве значения которого обычно используется функция. Не нужно называть его ключем. Здесь это слово имеет отдаленный смысл, то есть это "ключ" для решения задачи использования сравнения для элементов списка.

key=None - Ожидается в форме именованного аргумента. Функция, принимающая аргументом элемент, используемая для получения из этого элемента значения для сравнения его с другими. None — сравнить элементы напрямую.
Например: key=str.lower.
Примеры:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
>>> D
{'a': 3, 'c': 1, 'b': 2}
>>> sorted(D)
['a', 'b', 'c']
>>> D
{'a': 3, 'c': 1, 'b': 2}
>>> D
{'a': 3, 'c': 1, 'b': 2}
>>> sorted(D.items())
[('a', 3), ('b', 2), ('c', 1)]
 
>>> my_dict = {'a': 3, 'c': 1, 'b': 2}
>>> sorted(my_dict)
['a', 'b', 'c']
 
my_dict = {'a': 3, 'c': 1, 'b': 2}
 
# Упорядочим элементы словаря по ключам.
sorted(my_dict.items(), key=lambda item: item[0])  
# [('a', 3), ('b', 2), ('c', 1)]
 
# Упорядочим элементы словаря по значениям.
sorted(my_dict.items(), key=lambda item: item[1])  
# [('c', 1), ('b', 2), ('a', 3)]
 
my_dict = {'a': 3, 'c': 1, 'b': 2, '0': 3}
 
# Упорядочим по значениям и ключам.
sorted(my_dict.items(), key=lambda item: (item[1], item[0]))
# [('c', 1), ('b', 2), ('0', 3), ('a', 3)]
 
# А теперь по значениям по убыванию и ключам.
sorted(my_dict.items(), key=lambda item: (-item[1], item[0]))
# [('0', 3), ('a', 3), ('b', 2), ('c', 1)]
 
>>> t2 = ('s', 'p', 'a', 'm')
>>> t2
('s', 'p', 'a', 'm')
>>> "".join(t2)
'spam'
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 20:29  [ТС]
Viktorrus, спасибо, но меня больше интересует итерирование по спискам, без использования хэш-функций...например, :
Python
1
2
L = ['abc', 'aBc', 'Abc', 'abC']
sorted(L, key = str.upper)
Почему результатом выполнения этих инструкций получается список идентичный входным данным: ['abc', 'aBc', 'Abc', 'abC']. Я понимаю алгоритм поэлементного применения функции при итерировании по списку и мне понятен результат выполнения. Мне необходим алгоритм выполнения сортировки при заданном аргументе key = func(), а также другие методы, функции и модули применяемые при выполнении данного вида задач.

Добавлено через 9 минут
Например при работе с данными типа int() при использовании DataFrame в библиотеке pandas. Я понимаю, что необходима четко сформулированная цель или поставленная задача для ответа на этот вопрос, мне необходимо общее понимание возможностей используемых языком программирования python при решении такого рода задач.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.07.2020, 20:40
Цитата Сообщение от AlexMarkov Посмотреть сообщение
итерирование по спискам, без использования хэш-функций
Хеш-функции к спискам в общем случае не применимы. Так как значениями списков могут быть любые объекты, в том числе и не хешируемые. Итерирование, это последовательное взятие по одному элементу из массива. В питоне существуют инструкции, которые в процессе своей работы осуществляют итерирование. Например цикл for и многие другие. С pandas не знаком, поэтому ничего сказать в данном случае не могу.
0
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
29.07.2020, 20:41
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Почему результатом выполнения этих инструкций получается список идентичный входным данным: ['abc', 'aBc', 'Abc', 'abC']
а что вы хотели этим сделать? вы же переводите строку в верхний регистр в ключе.
это тоже самое что сортировать
Python
1
L = ['ABC', 'ABC', 'ABC', 'ABC']
вот вам понятней пример
Python
1
2
3
4
>>> L = ['1234', '1232', '1231', '1235']
>>> print(sorted(L, key = int))
['1231', '1232', '1234', '1235']
>>>
мы сортируем строки но ключ дает понять что рассматривать строки при сортировке нужно как числа
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 20:43  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
без использования хэш-функций
Небольшая корректировка: без использования хэш-функций, применяемых на примере выше.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.07.2020, 20:49
А что касается Вашего примера, то здесь все ясно.
Python
1
2
L = ['abc', 'aBc', 'Abc', 'abC']
sorted(L, key = str.upper)
Каждый раз, при сравнении двух элементов (что бы расставить их по возрастанию) перед сравнением используется функция str.upper . При использовании этой функции мы получаем в списке равные элементы 'ABC'. Но если при сравнении элементы оказываются равны, то никакой перестановки не происходит. Поэтому при такой сортировке мы на выходе получаем то же, что и на входе, перед сортировкой.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 20:53  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
При использовании этой функции мы получаем в списке равные элементы 'abc'.
метод .upper скорее всего 'ABC'.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.07.2020, 20:54
Цитата Сообщение от AlexMarkov Посмотреть сообщение
метод .upper скорее всего 'ABC'
Сорри, ошибся Но элементы, после преобразования функцией, все равно равны.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 20:55  [ТС]
Viktorrus, например при применении алгоритма быстрой сортировки, возможен вариант реализации применения параметра key:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding: utf-8 -*-
""" Алгоритм быстрой сортировки
"""
def quicksort(array):
    if len(array) < 2:
        return array # базовый случай
    else:
        pivot = array[0] # рекурсивный случай
        less = [i for i in array[1:] if i <= pivot] # элементы меньше опорного
        greater = [i for i in array[1:] if i > pivot] # элементы больше опорного
        return quicksort(less) + [pivot] + quicksort(greater)
 
print (quicksort([10, 5, 2, 3, 7, 8])) # вывод на экран
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
29.07.2020, 21:02
Цитата Сообщение от AlexMarkov Посмотреть сообщение
без использования хэш-функций, применяемых на примере выше
Кстати при sorted питон не использует хеш-функции. Он их использует для ключей словарей.

Добавлено через 4 минуты
AlexMarkov, Почему Вы считаете, что Ваша сортировка быстрее? sorted написана на Си, а Ваша на питоне, и поэтому Ваша всегда будет медленнее, может быть только за исключением каких то частных случаев.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 21:13  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Но элементы, после преобразования функцией, все равно равны.
Цитата Сообщение от Viktorrus Посмотреть сообщение
Почему Вы считаете, что Ваша сортировка быстрее?
)))просто название реализации алгоритма ничего общего с наречием "быстрее" данная терминология не несет, такая информация в общедоступных источниках.

Добавлено через 6 минут
Viktorrus, не могу наработать навыки использования более сложных функций в качестве ключа, поэтому задал этот вопрос, например в этом примере:
Python
1
2
3
4
s = 'Hello World'
>>> sorted(s.lower(), key = lambda x: (-s.count(x), x))
['l', 'l', 'l', 'o', 'o', ' ', 'd', 'e', 'r', 'h', 'w']
>>>
Добавлено через 2 минуты
Данный пример взят из форума и написан с полным пониманием выполнения алгоритма данной функции, хотел бы так же...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.07.2020, 21:16
AlexMarkov,
А каков был ваш настоящий вопрос? Я прочитал ваш пост, но что вас интересует так и не понял.
Алгоритм сортировки в Python называется TimSort, по имени его изобретателя и автора Python дзен Тима Петерса.
Это лучший алгоритм сортировки для частично упорядоченных данных, c которыми программистам приходится иметь дело чаще всего.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 21:31  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
А каков был ваш настоящий вопрос?
Использование оператора "-" в заданной в качестве ключа анонимной функции. К каким значениям применяется данный оператор?

Добавлено через 3 минуты
Цитата Сообщение от Garry Galler Посмотреть сообщение
Алгоритм сортировки в Python называется TimSort
Правильно я понимаю, что данный алгоритм создает кортежи с номером значения и элементом сортируемого списка или кортежи - результат выполнения метода count?

Добавлено через 2 минуты
или я вообще ни чего не понимаю
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.07.2020, 21:31
Лучший ответ Сообщение было отмечено AlexMarkov как решение

Решение

Минус инвертирует порядок сравнения на обратный
Python
1
2
3
>>> sorted(range(100), key=lambda x:-x)
[99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>>
что равносильно указанию параметра reverse=True.
-count инвертирует сравнение с возрастания по кол-ву на убывание по кол-ву.
Сравнение по двум значениям означает, что сортировка сначала производится по первому ключу, затем по второму.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
29.07.2020, 21:43  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
что равносильно указанию параметра reverse=True
Данная информация есть в официальной документации? Откуда такие ценные данные? на заметку...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.07.2020, 22:26
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Данная информация есть в официальной документации?
Именно этой я не видел. Способы сортировки по разным ключам и с инвертированием как всегда были нагуглены на stackoverflow.
А вообще в Python доках есть отдельный раздел по сортировке: https://docs.python.org/3/howto/sorting.html
Там есть примеры с сортировкой по ключам и с применением кастомной функции сортировки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2020, 22:26
Помогаю со студенческими работами здесь

Сортировка словаря по ЗНАЧЕНИЮ(не по ключу)
Собственно, как это сделать? Вот мой код: import sys from pprint import pprint #iter_count = int(sys.argv) # Помещаем дзен из...

Цифровая сортировка односвязного списка по ключу
Помогите, пожалуйста, написать функцию для цифровой сортировки списка по полю name(фамилия). Ключ - первые три буквы фамилии. #include...

Цифровая сортировка односвязного списка по ключу
Помогите, пожалуйста, написать функцию для цифровой сортировки списка по полю name(фамилия). Ключ - первые три буквы фамилии. #include...

Цифровая сортировка списка по составному ключу
Здравствуйте. Почему то при цифровой сортировке пропадает часть данных. Не могу найти куда и почему(( Предполагаю что они просто не...

Сортировка списка объектов по ключу(атрибуту) в алфавитном порядке
Как работает сортировка в javascript? Мне нужно отсортировать в алфавитном порядке по ключу Pair. let data = undefined ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru