2017-01-23 3 views
0

Во-первых, я заметил, что в сортировке списков кортежей много вопросов, однако, просмотрев несколько сообщений, я не видел ни одного вопроса с этим конкретным форматом для списка. Извиняюсь заранее, что для возможного повторного вопроса, однако я думаю, что это должно быть просто.Python - сортировка списка кортежей на основе нескольких элементов сортировки

Пусть список кортежей быть таким:

my_list = [(('G', 'J', 'I'), 1.0), (('E', 'H', 'F'), 1.0), (('F', 'H', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'I', 'G'), 0.8889), (('H', 'J', 'I'), 0.875)] 

Обратите внимание, что каждый кортеж в списке состоит из 1: другой кортеж длины 3 с 3-х букв и 2: число с плавающей точкой. Моя задача сортировки проста: 1-й сортировать список кортежей по числу с плавающей запятой, 2-й разбить любые связи в числе с плавающей запятой, затем сортировать по первой букве в корте по длине-3, 3-й разбить любые связи в этой букве на сортировка по 2-й букве в корте 3 длины. Желаемый результат будет тогда:

sorted_list = [(('E', 'H', 'F'), 1.0), (('G', 'J', 'I'), 1.0), (('F', 'H', 'G'), 0.8889), (('H', 'I', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'J', 'I'), 0.875)] 

в данном конкретном примере, сортировка на 2-ом письме разорвать связи на первое письмо не появилось, хотя это не в моем большем наборе данных.

Спасибо!

+1

Итак, вы хотите, чтобы отсортировать в порядке убывания поплавка, и в порядке возрастания букв в кортеже? Попробуйте 'key = lambda t: (-t [1], t [0])' –

+0

Возможный дубликат [Python 3.3 Сортировка списка кортежей с несколькими ключами] (http://stackoverflow.com/questions/23454961/python- 3-3-sorting-a-tuple-list-with-multiple-keys) – Prune

ответ

2

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

srt_lst = sorted(my_list, key=lambda (x, y): (-y, x)) #python 2 
print(srt_lst) 
# [(('E', 'H', 'F'), 1.0), (('G', 'J', 'I'), 1.0), (('F', 'H', 'G'), 0.8889), (('H', 'I', 'G'), 0.8889), (('I', 'K', 'J'), 0.8889), (('H', 'J', 'I'), 0.875)] 

В Python 3, вы должны будете индекс одного параметра лямбда для доступа к элементам и использовать их для сортировки:

srt_lst = sorted(my_list, key=lambda tup: (-tup[1], tup[0])) 
+1

Примечание: распаковка кортежа в 'lambda' не работает в Python 3; в противном случае штраф. –

+0

@tobias_k Спасибо, что заметили. Их тег Python 3 отсутствовал –

+0

спасибо - используя python 2, и можете подтвердить, что первое решение правильно отсортировано для меня. – Canovice