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

#python-3.x #sorting #graph

#питон #python-3.x #сортировка #python

Вопрос:

 [((D,A),0.0),((D,C),0.0),((D,E),0.5)]
  

Мне нужно отсортировать список следующим образом:

 [((D,E),0.5),((D,A),0.0),((D,C),0.0)]
  

Я использовал эту sorted() функцию, и я могу сортировать на основе значений 0.5, 0.0 … Но я не могу выполнить сортировку в алфавитном порядке, так как мне нужно, чтобы список был отсортирован в порядке убывания по числам и в порядке возрастания алфавитов, если числа имеют одинаковое значение.

Комментарии:

1. sorted(li, key=lambda t: (-t[-1],t[0]))

Ответ №1:

Используйте кортеж в качестве ключа сортировки с отрицательным значением с плавающей точкой, чтобы изменить порядок:

 >>> li=[(('D','A'),0.0),(('D','C'),0.0),(('D','E'),0.5)]
>>> sorted(li, key=lambda t: (-t[-1],t[0]))
[(('D', 'E'), 0.5), (('D', 'A'), 0.0), (('D', 'C'), 0.0)]
  

Если вы не можете выполнить отрицание (скажем, для строки или буквенного значения или чего-то нечислового), вы можете воспользоваться тем фактом, что функция сортировки Python стабильна, и выполнить сортировку в два этапа:

 >>> li=[(('D','A'),'A'),(('D','C'),'A'),(('D','E'),'C')]
>>> sorted(sorted(li), key=lambda t: t[-1], reverse=True)
[(('D', 'E'), 'C'), (('D', 'A'), 'A'), (('D', 'C'), 'A')]
  

Комментарии:

1. Существует отличный обзор того, как сортировать в Python.

Ответ №2:

Аналогично, вы могли бы предоставить sorted итерацию, которая является результатом другого sort :

 >>> from operator import itemgetter
>>> t = [(('D','A'),0.0),(('D','C'),0.0),(('D','E'),0.5)]
>>> sorted(sorted(t), key=itemgetter(1), reverse=True)
[(('D', 'E'), 0.5), (('D', 'A'), 0.0), (('D', 'C'), 0.0)]