2017-01-28 3 views
0

Хотя я не совсем новичок в программировании, я новичок в python. Имея некоторый опыт работы с Haskell и узнав, что python также реализует понимание списков, я попытался написать функцию quicksort Haskell-esk.Python - непреднамеренное удаление дубликатов в понимании списка

def quicksort(unsorted): 
    """\ 
    Sorts a list least to greatest numerically using quicksort 
    """ 
    if not unsorted: 
     return [] 
    else: 
     pivot, *rest = unsorted 
     lower_sorted = quicksort([a for a in rest if a < pivot]) 
     upper_sorted = quicksort([a for a in rest if a > pivot]) 
     return lower_sorted + [pivot] + upper_sorted 

Он сортирует данный список, но при этом удаляет любые повторяющиеся элементы; очевидно, это не функция, которую обычно требуется в функции сортировки. Любые идеи относительно того, почему это происходит, и как я могу это исправить (или любые другие вопиющие проблемы, которые я пропустил)? Это с Python 3.6.0.

+1

Что такое 'lower_rest' и' upper_rest' и тегены? – DyZ

+1

Я думаю, что вы игнорируете случай, когда 'a = pivot'. Вы должны рассмотреть это как в 'lower_sorted', так и' upper_sorted'. –

+1

Предполагая, что нижний и верхний остальной и опорный точки являются опечатками, рассмотрите, что происходит, когда 'a' равно' pivot'. –

ответ

5

Одно из условий (либо if a < lower_pivot, либо if a > upper_pivot) должно включать проверку равенства.

+0

Почему это так? Если я вернусь, нижние_сортированные, сводные и верхние_сортированные, объединенные вместе, почему мне нужно включить точку поворота в любом из них? Это действительно исправило проблему, спасибо, но я думаю, что я боюсь понять, почему. – sToxic5

+3

Потому что, если у вас есть более одной копии 'pivot', включен только один из них. – DyZ

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