2013-09-15 4 views
2

Я хочу отсортировать список кортежей, где кортежи имеют тип (a, b), где a и b являются целыми числами. Ключ для сортировки списка должен быть разницей между a и b i.e a - b и разорвать галстуки, он должен сортировать по a, как в порядке убывания.Сортировка списка кортежей по нескольким клавишам

Я попытался с помощью этого:

def sort(list): 
     scores = sorted(list, key=lambda list: list[0], reverse=True) 
     scores = sorted(list, key=lambda list: (a - b), reverse=True) 

Но это, кажется, сортировать по разности и изменять порядок элементов, отсортированных по первому элементу кортежа.

Например:

вход:

[(75, 10), (88, 4), (93, 9), (80, 5), (94, 10)] 

Ожидаемый выход:

[(94, 10), (93, 9), (88, 4), (80, 5), (75, 10)] 

Полученный выход:

[(93, 9), (88, 4), (94, 10), (80, 5), (75, 10)] 

ответ

4

Вы можете сортировать по ключу соединения:

>>> def sort(list): 
...  return sorted(list, key=(lambda (a, b): ((a - b), a)), reverse=True) 
... 
>>> sort([(75, 10), (88, 4), (93, 9), (80, 5), (94, 10)]) 
[(94, 10), (93, 9), (88, 4), (80, 5), (75, 10)] 

Смотрите Python Wiki Sorting Howto для некоторых хороших советов.

+0

Точно, что я хотел, спасибо! – jobin

1
list_sorted = sorted(list, key = lambda x: (x[0]-x[1], x[0]), reverse=True) 

lambda для key могут возвращать кортежи, порядок может указывать приоритеты сортировки.

1

Чтобы получить заказ, который вы ищете, сортировать с помощью составного ключа:

def sort(l): 
    scores = sorted(l, key=lambda(e): (e[0] - e[1], e[0]), reverse=True) 

Это даст:

scores = [(94, 10), (93, 9), (88, 4), (80, 5), (75, 10)] 

NB:list это ключевое слово, и не должны использоваться как имя переменной.

+0

Неверный. Предполагается, что это первый критерий. Добавьте в список tuple '(95, 94)', и вы увидите, что он отсортирован неправильно. Кроме того, у вас есть условия в разнице. –

+1

@StevenRumbalski: Спасибо, исправили. Обычно я удаляю такой ответ, но другие ответы пропускают опасность использования 'list' в качестве идентификатора. – Johnsyweb

1

Ключ лямбда хочет один входное значение (кортеж ОК)

sorted(data, key=lambda (a, b): (a-b, a), reverse=True) 
0

К сожалению, я не нарушал связи: /. Я получил заказ без использования ничего сложного ... здесь:

def sort(list): 
    scores = sorted(list, key=lambda a: a[0], reverse=True) 

    return scores 

print sort([(75, 10), (88, 4), (93, 9), (80, 5), (93, 11), (94, 10)]) 

консоли:

[(94, 10), (93, 9), (93, 11), (88, 4), (80, 5), (75, 10)] 

Когда я сортирую на различиях, аб, это результат:

def sort(list): 

    scores = sorted(list, key=lambda a: a[0], reverse=True) 
    scores = sorted(list, key=lambda a: a[0]-a[1], reverse=True) 

    return scores 

print sort([(75, 10), (88, 4), (93, 9), (80, 5), (93, 11), (94, 10)]) 

консоли :

[(88, 4), (93, 9), (94, 10), (93, 11), (80, 5), (75, 10)] 
+0

Я хочу отсортировать список по разности элементарных кортежей. Он работает для этого случая ввода, но не в целом. – jobin

+0

Да, я заметил. Я пытался с немного другим вводом: [(75, 10), (88, 4), (93, 9), (80, 5), (93, 11), (94, 10)]. Вы уверены в своем ожидаемом вкладе? Потому что, когда у меня есть разногласия a-b, результат сильно отличается. – Cawb07

+0

Да, надеюсь, вы видели, что это убывающий порядок. – jobin

Смежные вопросы