Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2017 17:08:05

i2n7r1t
Зарегистрирован: 2017-02-01
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

Добрый вечер. При изучении словарей появилась проблема при решении одной задачи. У нас есть словарь:

 {'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)

Хочу сразу предупредить, что задача подразумевает минимальные знания, т.е. желательно без использования лямбд (это еще не изучалось) и без использования каких-либо сторонних библиотек.

Отредактировано i2n7r1t (Фев. 1, 2017 17:09:37)

Офлайн

#2 Фев. 1, 2017 17:15:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

Фиг его знает, что такое лексикографический порядок, но все хитрые сортировки выполняются с применением функции 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)))



Офлайн

#3 Фев. 1, 2017 17:25:27

i2n7r1t
Зарегистрирован: 2017-02-01
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

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'

Офлайн

#4 Фев. 1, 2017 17:56:35

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

 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))

Офлайн

#5 Фев. 1, 2017 18:34:20

i2n7r1t
Зарегистрирован: 2017-02-01
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

спасибо, осталось разобраться как работает участок, но это уже на моей совести.

 key=lambda k:k[1]

Офлайн

#6 Фев. 1, 2017 18:50:31

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

Офлайн

#7 Фев. 2, 2017 03:05:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка списка кортежей

Тут надо использовать свойство сортировки обычных кортежей (кортежи сначала сортируются по первому элементу, потом по второму, потом по третьему и так далее)

  
>>> 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)]
>>>
Поэтому мы сначала их приводим к нужному виду, меняя порядок элементов в кортеже, потом эти кортежи сортируются относительно друг друга по первому и по второму элементу, а потом отсортированные кортежи разворачиваются обратно, в первоначальный порядок.



Отредактировано py.user.next (Фев. 2, 2017 03:11:17)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version