Расширенные критерии сортировки списка вложенных кортежей

У меня есть список вложенных кортежей в форме:

[(a, (b, c)), ...]

Теперь я хотел бы выбрать элемент, который максимизируетa минимизируяb а такжеc в то же время. Например в

[(7, (5, 1)), (7, (4, 1)), (6, (3, 1))]

победитель должен быть

(7, (4, 1))

Любая помощь приветствуется.

 eksortso30 сент. 2010 г., 17:48
позвольте мне угадать, что именно вы приоритизируете в своем роде: самый большойaтогда самый маленькийbтогда самый маленькийc, Это правильно?
 mathias30 сент. 2010 г., 16:57
Хороший вопрос. (7, (3,2)) побеждает.
 mathias30 сент. 2010 г., 18:43
@ eksortso: Да, это правильно. Я должен был прояснить это в вопросе, извините. Тем не менее, по моим данным, c имеет тенденцию быть очень маленьким, поэтому его можно игнорировать.
 Daenyth30 сент. 2010 г., 16:38
Дано(7,(4,1)) а также(7,(3,2))какой из них выигрывает?

Ответы на вопрос(2)

Решение Вопроса

вы хотите отсортировать по убыванию по а, по возрастанию по b, а затем по c. Если это правильно, вы можете сделать это так:

>>> l=[(7, (5, 1)), (7, (4, 1)), (6, (3, 2)), (6, (3, 1))]
>>> sorted(l, key = lambda x: (-x[0], x[1]))
[(7, (4, 1)), (7, (5, 1)), (6, (3, 1)), (6, (3, 2))]

Выбрать «победителя» так же просто, как выбрать первый элемент.

Если бы b и c были суммированы, это было бы простоsum(x[1]) вместоx[1] в моем примере.

Моя ключевая функция возвращает кортеж, потому что Python правильно сортирует кортежи, содержащие несколько элементов:

>>> sorted([(1,2), (1,1), (1,-1), (0,5)])
[(0, 5), (1, -1), (1, 1), (1, 2)]
 mathias30 сент. 2010 г., 16:58
На самом деле это настоящая проблема, а не домашнее задание. Спасибо, в любом случае.
 SilentGhost30 сент. 2010 г., 16:30
max имеетkey параметр, поэтому нет необходимости создавать промежуточный список. Признаки, конечно, должны быть полностью изменены.
 AndiDog30 сент. 2010 г., 16:34
@SilentGhost: Конечно,max функция хорошая идея здесь. Я хотел отметить, что в зависимости от проблемы (или домашней работы), которую пытается решить ОП, может потребоваться выбрать несколько предметов. Таким образом, предварительно отсортированный список будет лучше.
>>> max(lst, key=lambda x: (x[0], -x[1][0], -x[1][1]))
(7, (4, 1))

Ваш ответ на вопрос