Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 04.04.2021
Сообщений: 4

Сортировка словаря

04.04.2021, 00:40. Показов 4284. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как отсортировать словарь по произведению ключа и значения?
INPUT:
30:8
50:12
40:14
20:10
OUTPUT:
30:8
20:10
40:14
50:12
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2021, 00:40
Ответы с готовыми решениями:

Сортировка Словаря
Доброго Времени Суток, подскажите, как бы мне отсортировать такой словарь в порядке УБЫВАНИЙ его значений? d={'a':5,'b':6,'c':8}

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

Сортировка словаря
##Дан словарь. Помогите остортировать его по значению Номер Dictionary = {'№':,'1':,'2':,'3':} print...

46
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
04.04.2021, 01:28
biggvladik, отсортировать словарь или вывести в сортированном порядке?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38187 / 21122 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
04.04.2021, 09:14
Цитата Сообщение от biggvladik Посмотреть сообщение
Как отсортировать словарь по произведению ключа и значения?
- если речь о выводе, то построить список пар (ключ, произведение), отсортировать этот список, а потом "пройтись по нему" и вывести элементы словаря в нужном порядке

Python
1
2
3
4
5
6
7
8
9
10
def pr_sort(d):
    tmp=[]
    for k,v in d.items():
        tmp.append((k*v,k))
    for a in sorted(tmp):
        print(a[1],":",d[a[1]],sep='')
    
d={30:8,50:12,40:14,20:10}
 
pr_sort(d)
biggvladik, твоя сортировка неправильна
2
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 11:48
Цитата Сообщение от biggvladik Посмотреть сообщение
Как отсортировать словарь по произведению ключа и значения?
Python
1
2
3
4
5
from math import prod
 
a = [tuple(int(x) for x in input().split(":")) for _ in range(4)]
a.sort(key=prod)
print(*map(lambda x: "{}:{}".format(*x), a), sep="\n")
Вывод: косячное условие.
1
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
04.04.2021, 12:08
Python
1
print({x:y for n,x,y in sorted(((x*y,x,y) for x,y in d.items()), reverse=1)})
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38187 / 21122 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
04.04.2021, 15:44
Matrix3007, сами-то запускали? У меня Ваш код дает такой результат:

{40: 14, 50: 12, 20: 10, 30: 8}

Это - сортировка по произведению ключ*значение?
0
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
04.04.2021, 15:56
Цитата Сообщение от Catstail Посмотреть сообщение
сами-то запускали?
Запускали. Выдаёт как надо.
Цитата Сообщение от Catstail Посмотреть сообщение
Это - сортировка по произведению ключ*значение?
Ну да, по коду видно вроде.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.04.2021, 16:09
Цитата Сообщение от Catstail Посмотреть сообщение
дает такой результат:
{40: 14, 50: 12, 20: 10, 30: 8}
Python
1
2
3
4
5
6
>>> d={30:8,
50:12,
40:14,
20:10}
>>> {x:y for n,x,y in sorted(((x*y,x,y) for x,y in d.items()), reverse=1)}
{50: 12, 40: 14, 30: 8, 20: 10}
Matrix3007,
Только это обратный порядок.

И, кстати, все эти прямые сортировки словаря вряд ли будут работать на Python ниже версии 3.6, так как там порядок вставки не сохранялся, а числовые ключи сортировались автоматически.
0
 Аватар для Matrix3007
198 / 164 / 41
Регистрация: 13.05.2019
Сообщений: 844
04.04.2021, 16:16
Цитата Сообщение от Catstail Посмотреть сообщение
{40: 14, 50: 12, 20: 10, 30: 8}
На некоторых версиях питона почему-то выдаёт в таком порядке. Почему - не знаю, но дело скорее всего в словаре, потому что sorted там работает так же.

Добавлено через 2 минуты
Цитата Сообщение от Garry Galler Посмотреть сообщение
Только это обратный порядок.
Кстати да, сам не понял, зачем развернул)
Цитата Сообщение от Garry Galler Посмотреть сообщение
так как там порядок вставки не сохранялся
Теперь понятно

Добавлено через 3 минуты
Python
1
print(*(f"{x}:{y}" for n,x,y in sorted(((x*y,x,y) for x,y in d.items()))))
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 16:20
Цитата Сообщение от Garry Galler Посмотреть сообщение
а числовые ключи сортировались автоматически.
Сомнительное утверждение...
Это ж не красно-черное дерево, а хеш-таблица - к ней неприменимо понятие сортировки ключей. Порядок ключей в хеш-таблице зависит от хеша соответствующего ключа. Это только с Python 3.6 начал учитываться порядок, в т. ч. двусвязный список по ключам.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.04.2021, 16:38
Цитата Сообщение от Arsegg Посмотреть сообщение
Сомнительное утверждение...
Можно попробовать. Такая сортировка оптимальна для хэшей.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 16:49
Цитата Сообщение от Garry Galler Посмотреть сообщение
Можно попробовать. Такая сортировка оптимальна для хэшей.
Даже близко не сортировка:
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.04.2021, 16:54
Arsegg,
Я же сказал только про числовые ключи.
И, точнее будет сказать, что это не какая-то специальная сортировка, а скорей особенность самого хэширования.
Ведь каждый ключ отображается в какой-то целочисленный индекс из диапазона 0...n-1.
Логично предполагать, что числовые ключи (не все, но до некоторого диапазона) автоматически попадают в ячейку по индексу совпадающему с самим числом.
И в итоге у Python словаря получалась некая автосортировка, если все ключи были числовыми.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 17:07
Цитата Сообщение от Garry Galler Посмотреть сообщение
Я же сказал только про числовые ключи.
К сожалению, даже в этом случае вы не правы:

Цитата Сообщение от Garry Galler Посмотреть сообщение
И, точнее будет сказать, что это не какая-то специальная сортировка, а скорей особенность самого хэширования.
Нет здесь никакой особенности, просто неуместно мешать данные понятия.
Цитата Сообщение от Garry Galler Посмотреть сообщение
Ведь каждый ключ отображается в какой-то целочисленный индекс из диапазона 0...n-1.
Вы не учли возможное коллизии - когда разные ключи имеют одинаковый хеш. У данных ключей будет разный индекс в хеш-таблице.
Цитата Сообщение от Garry Galler Посмотреть сообщение
Логично предполагать, что числовые ключи (не все, но до некоторого диапазона) автоматически попадают в ячейку по индексу совпадающему с самим числом.
Не факт, опять же. В Python используется открытая адресация для разрешения коллизий (какая именно - нужно смотреть детально). Индекс ключа по его хешу с ходу нельзя определить без итерации по ключам с аналогичным хешем в хеш-таблицы. Сложно, но как-то так.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 17:21
Garry Galler, посмотрите на забавный "эксперимент":
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.04.2021, 17:24
Цитата Сообщение от Arsegg Посмотреть сообщение
К сожалению, даже в этом случае вы не правы:
И опять же я же добавил, что так происходит для определенного диапазона.
И, естественно, функция хэширования в словарях сложнее, чем встроенная в Python hash().

Реально там сейчас происходит примерно так:

Python
1
2
3
4
5
n = 500 # макс. размер  словаря
for i in range(100):
    h = hash(i) >> 5
    j = (5*i) + 1 + h
    print(f"[{j % n}]={i}")
Спор в общем ни о чем.
Хотите деталей - смотрите исходники. Я не пытался объяснить как устроен Python словарь сейчас и ранее, а лишь подчеркнул особенности, которые были ранее.
0
 Аватар для Semen-Semenich
5234 / 3479 / 1175
Регистрация: 21.03.2016
Сообщений: 8,306
04.04.2021, 17:32
Цитата Сообщение от biggvladik Посмотреть сообщение
INPUT:
30:8
50:12
40:14
20:10
OUTPUT:
30:8
20:10
40:14
50:12
я один не понимаю что то?
Python
1
2
3
4
5
6
7
8
9
>>> 30 * 8
240
>>> 50 *12
600
>>> 40 * 14
560
>>> 20 * 10
200
>>>
результат по ключам должен быть
20, 30, 40, 50
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38187 / 21122 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
04.04.2021, 17:39
Semen-Semenich, не один. Я тоже указал ТС на это обстоятельство.

Сортировать словарь - глупая затея. Словарь придуман для того, чтобы индексировать можно было не числом, а строкой или чем-то подобным. При чем здесь порядок?
1
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 17:45
Цитата Сообщение от Garry Galler Посмотреть сообщение
И опять же я же добавил, что так происходит для определенного диапазона.
Я не ставил перед собой цели вас переубедить.
Цитата Сообщение от Garry Galler Посмотреть сообщение
И, естественно, функция хэширования в словарях сложнее, чем встроенная в Python hash().
Равномерное распределение хешей тоже мало относится к сортировке ключей.
Цитата Сообщение от Garry Galler Посмотреть сообщение
Я не пытался объяснить как устроен Python словарь сейчас и ранее, а лишь подчеркнул особенности, которые были ранее.
Это не про конкретную реализацию, в т. ч. Python. Я про то, что хеш-таблицы ничего не имеют общего с сортировкой ключей.
Цитата Сообщение от Garry Galler Посмотреть сообщение
И в итоге у Python словаря получалась некая автосортировка, если все ключи были числовыми.
Я вам показал на числовых ключах, что это так не работает.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
04.04.2021, 18:26
Подкину в вентилятор
Python
1
2
dic = {30: 8, 50: 12, 40: 14, 20: 10}
print('\n'.join([f'{i[0]}:{i[1]}' for i in sorted(dic.items(), key=lambda x: x[0] * x[1])]))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2021, 18:26
Помогаю со студенческими работами здесь

Сортировка словаря
Функция сортировки по алфавиту: def alphabet_sort(to_sort: dict) -> dict: # Сортировка в алфавитном порядке производителей ...

Сортировка словаря
добрый день. Помогите отсортировать список. def main(): spisok = {'a': {1, 2, 3}, 'b': {3, 4, 5}, 'c': {5, 6}, } korteg =...

Сортировка словаря
Всем привет. Есть словарь: babynames = { 'София, Софья': { 2012: ', 2010: ', 2005: ',

Сортировка словаря
Функция которая возвращает словарь. Но бывает что возвращает его не в том порядке в котором задавался. def multiply(vector, num): ...

Сортировка словаря
database = { "Группа1":, , ], "Группа2":, ] } def cout2(groupname): for key in...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru