сортировка кортежей в python с помощью пользовательского ключа - PullRequest
4 голосов
/ 29 декабря 2010

Привет: Я пытаюсь отсортировать список кортежей нестандартным способом:
Например:

lt = [(2,4), (4,5), (5,2)]

должно быть отсортировано:

lt = [(5,2), (2,4), (4,5)]

Правила:
* b кортеж больше кортежа, если a [1] == b [0]
* кортеж больше, чем кортеж b, если a [0] == b [1]

Я реализовал функцию cmp следующим образом:

def tcmp(a, b):
    if a[1] == b[0]:
       return -1
    elif a[0] == b[1]:
       return 1
    else:
       return 0

но сортировка списка:

lt.sort(tcmp)

покажи мне:

lt = [(2, 4), (4, 5), (5, 2)]

Что я делаю не так?

Ответы [ 6 ]

11 голосов
/ 12 февраля 2012

Для меня очень важно, что вы пытаетесь решить одну из проблем класса Google Python, которая заключается в сортировке списка кортежей в порядке возрастания на основе их последнего элемента.

Вот как я это сделал:

def sort_last(tuples):

  def last_value_tuple(t):
    return t[-1]

  return sorted(tuples, key=last_value_tuple)

РЕДАКТИРОВАТЬ: Я не прочитал все это, и я предположил, что это было основано на последнем элементе кортежа.Ну, все же я собираюсь оставить это здесь, потому что это может быть полезно любому.

4 голосов
/ 29 октября 2013

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

def sort(tuples):
  return sorted (tuples,key=lambda last : last[-1])

so sort ([(1, 3), (3, 2), (2, 1)]) даст [(2, 1), (3, 2), (1, 3)]

4 голосов
/ 21 марта 2013

Вы можете написать свою собственную функцию ключа, чтобы указать значение ключа для сортировки.

Ex.

def sort_last(tuples):

    return sorted(tuples, key=last)

def last(a):
    return a[-1]

tuples => отсортировано по последнему элементу

  • [(1, 3), (3, 2), (2, 1)] => [(2, 1), (3, 2), (1, 3)]
  • [(1, 7), (1, 3), (3, 4, 5), (2, 2)] => [(2, 2), (1, 3), (3, 4, 5), (1, 7)]
2 голосов
/ 29 декабря 2010

Я не уверен, что ваша функция сравнения является допустимой в математическом смысле, то есть транзитивной. Учитывая a, b, c функцию сравнения, говорящую, что a > b и b > c подразумевают, что a > c. Процедуры сортировки основаны на этом свойстве.

Не говоря уже о том, что по вашим правилам для a = [1, 2] и b = [2, 1] у вас есть и a[1] == b[0], и a[0] == b[1], что означает, что a больше и меньше, чем b .

0 голосов
/ 29 декабря 2010

Ваша спецификация заказа неверна, потому что она не переходная .

Транзитивность означает, что если a < b и b < c, то a < c. Однако в вашем случае:

(1,2) < (2,3)
(2,3) < (3,1)
(3,1) < (1,2)
0 голосов
/ 29 декабря 2010

Попробуйте lt.sort(tcmp, reverse=True).

(Хотя это может привести к правильному ответу, могут быть другие проблемы с вашим методом сравнения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...