Сравнивать второй элемент из двух кортежей с '<' не удается в Python - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь написать функцию сортировки слиянием, которая принимает список и функцию сравнения, в Python:

def sort(unsorted, comp_func=lambda x, y: x < y):

    length = len(unsorted)
    if length  <= 1: return unsorted

    halflen = length / 2
    lsorted= sort(unsorted[:halflen])
    rsorted = sort(unsorted[halflen:])
    combined = []

    while True: 
        if len(lsorted) > 0:
            if len(rsorted) > 0 and comp_func(rsorted[0], lsorted[0]):
                combined.append(rsorted[0])
                rsorted = rsorted[1:]
            else:
                combined.append(lsorted[0])
                lsorted = lsorted[1:]
        elif len(rsorted) > 0:
            combined.append(rsorted[0])
            rsorted = rsorted[1:]
        else:
            break

    return combined

Она отлично работает со списками int (сcomp_func по умолчанию), а также списки кортежей, которые имеют 2 int , когда функция сравнения сравнивает первый элемент такого кортежа.

comp_func = lambda x, y: x[0] < y[0]

Но когда я пишу функцию сравнениядля сравнения по второму элементу кортежа возвращаемый список остается несортированной версией.

comp_func = lambda x, y: x[1] < y[1]

Однако, если я изменю оператор '<' на '>', чтобы список был отсортированпостепенно, это работает:

comp_func = lambda x, y: x[1] > y[1]

Не знаю, почему '<' не работает на втором элементе кортежей ... </p>

Поискав возможное объяснение, я нашел это: Думает ли Python 10 меньше, чем 9 .Однако это не так;сортируемый список содержит кортежи int , а не string .

1 Ответ

1 голос
/ 26 марта 2012

На самом деле вы не показываете расшифровку того, как вы изменили оператор, так что это только предположение, но обратите внимание, что эти две строки

lsorted= sort(unsorted[:halflen])
rsorted = sort(unsorted[halflen:])

не передают comp_func.Поэтому, если бы вы сделали что-то вроде этого:

>>> sort([(3,4),(1,2), (2,3)])
[(1, 2), (2, 3), (3, 4)]
>>> sort([(3,4),(1,2), (2,3)],lambda x,y: x[1] > y[1])
[(3, 4), (1, 2), (2, 3)]

, вы получили бы противоречивые результаты, потому что половину времени они сортируют с другим comp_func.Передача comp_func в строки lsorted= и rsorted= исправляет это:

>>> sort([(3,4),(1,2), (2,3)],lambda x,y: x[1] > y[1])
[(3, 4), (2, 3), (1, 2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...