Пользовательская сортировка Python, по разнице в двух элементах кортежа - PullRequest
3 голосов
/ 24 января 2012

Я новичок в пользовательских возможностях сортировки Python, но я уверен, что можно сделать следующее.У меня есть список кортежей, и каждый кортеж выглядит так:

(some_int, some_int2, string)

Я хочу отсортировать список по убыванию разницы между some_int и some_int2, то есть наибольшая разница между этими двумя целыми числами должна быть вглава списка.Можно смело предположить, что some_int2 всегда больше, чем some_int.

Спасибо всем.

Ответы [ 5 ]

7 голосов
/ 24 января 2012
mylist.sort(key=lambda t: t[0] - t[1])

Примечание. Я вычитаю их в «неправильном» порядке, что означает, что все различия получаются отрицательными и, таким образом, сортируются по величине по величине в начале списка.Если вы хотите, вы также можете вычесть их в «правильном» порядке и установить reverse=True:

mylist.sort(key=lambda t: t[1] - t[0], reverse=True)

Это может быть яснее, хотя и более многословно.

2 голосов
/ 24 января 2012

Поскольку можно предположить, что some_int2 всегда больше, чем some_int, вам просто нужно использовать разницу между ними в качестве ключа для сортировки:

l.sort(key=lambda t: t[1] - t[0])

Пример:

>>> l = [(1, 1, 'a'), (2, 0, 'b')]
>>> l.sort(key=lambda t: t[1] - t[0])
>>> l
[(2, 0, 'b'), (1, 1, 'a')]
1 голос
/ 24 января 2012

Если вы заинтересованы в улучшении своих навыков сортировки, вам может помочь Руководство по сортировке Python .Загружен примерами.Чтобы отсортировать, используя разницу между двумя элементами кортежа, определите ключевую функцию , которая вычисляет желаемый ключ сортировки:

>>> sorted(iterable, key=lambda t: t[1] - t[0], reverse=True)
1 голос
/ 24 января 2012

С x [0] всегда больше, чем x [1]:

lst.sort(key=(lambda x: x[0]-x[1]), reverse=True)

или

lst.sort(key=(lambda x: x[1]-x[0]))
1 голос
/ 24 января 2012
def my_cmp(a,b):
  return cmp(b[1]-b[0], a[1]-a[0])

my_list.sort(my_cmp)
...