Найти - Пользователи
Полная версия: Сортировка списка кортежей
Начало » Python для новичков » Сортировка списка кортежей
1
i2n7r1t
Добрый вечер. При изучении словарей появилась проблема при решении одной задачи. У нас есть словарь:

 {'hi': 2, 'what': 1, 'is': 3, 'your': 1, 'name': 3, 'my': 2, 'bond': 2, 'james': 1, 'damme': 4, 'van': 3, 'claude': 2, 'jean': 1}

Нам надо его отсортировать вначале по значениям (по убыванию), а элементы с одинаковым значением отсортировать в лексикографическом порядке.

Первый этап сортировки(по значению) я делал создавая список и используя функцию sort:

 words = {'hi': 2, 'what': 1, 'is': 3, 'your': 1, 'name': 3, 'my': 2, 'bond': 2, 'james': 1, 'damme': 4, 'van': 3, 'claude': 2, 'jean': 1}
words_list = [(val, key) for key, val in words.items() ]
words_list.sort(reverse=True)
print(words_list)  #[(4, 'damme'), (3, 'van'), (3, 'name'), (3, 'is'), (2, 'my'), (2, 'hi'), (2, 'claude'), (2, 'bond'), (1, 'your'), (1, 'what'), (1, 'jean'), (1, 'james')]

А как сделать лексикографический порядок у одинаковых значений? (например у 1 - your, what, jean,james. А нужно так - james, jean, what, your)

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

 words = {'hi': 2, 'what': 1, 'is': 3, 'your': 1, 'name': 3, 'my': 2, 'bond': 2, 'james': 1, 'damme': 4, 'van': 3, 'claude': 2, 'jean': 1}
print(sorted(words.items(), key = lambda k, v: len(v)))
i2n7r1t
FishHook
Фиг его знает, что такое лексикографический порядок,
Это словарный порядок, т.е. грубо говоря нам нужно по числам порядок по убыванию, а по словам по возрастанию(т.е. от A до Z)

Ваш код почему-то не запустился, ругается интерпретатор: (я еще не приступил к изучению лямбд, поэтому и исправить не смог Ваш код)

 Traceback (most recent call last):
  File "py.py", line 31, in <module>
    print(sorted(words.items(), key = lambda k, v: len(v)))
TypeError: <lambda>() missing 1 required positional argument: 'v'
Romissevd
 words = {'hi': 2, 'what': 1, 'is': 3, 'your': 1, 'name': 3, 'my': 2, 'bond': 2, 'james': 1, 'damme': 4, 'van': 3, 'claude': 2, 'jean': 1}
words =sorted(words.items())
print(sorted(words, key=lambda k:k[1], reverse=True))
i2n7r1t
спасибо, осталось разобраться как работает участок, но это уже на моей совести.

 key=lambda k:k[1]
py.user.next
Тут надо использовать свойство сортировки обычных кортежей (кортежи сначала сортируются по первому элементу, потом по второму, потом по третьему и так далее)
  
>>> d = {'hi': 2,
...      'what': 1,
...      'is': 3,
...      'your': 1,
...      'name': 3,
...      'my': 2,
...      'bond': 2,
...      'james': 1,
...      'damme': 4,
...      'van': 3,
...      'claude': 2,
...      'jean': 1}
>>> 
>>> out = [(j, i) for i, j in sorted((v, k) for k, v in d.items())]
>>> out
[('james', 1), ('jean', 1), ('what', 1), ('your', 1), ('bond', 2), ('claude', 2), ('hi', 2), ('my', 2), ('is', 3), ('name', 3), ('van', 3), ('damme', 4)]
>>>
Поэтому мы сначала их приводим к нужному виду, меняя порядок элементов в кортеже, потом эти кортежи сортируются относительно друг друга по первому и по второму элементу, а потом отсортированные кортежи разворачиваются обратно, в первоначальный порядок.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB