2017-01-28 7 views
0

私はプログラミングに全く新しいものではありませんが、私はPythonには初めてです。 Haskellの経験があり、Pythonもリスト内包を実装していることを知っているので、私は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 =ピボット'の場合を見落としていると思います。これを 'lower_sorted'または' upper_sorted'のいずれかで考慮する必要があります。 –

+1

下部と上部のrestとpivotがタイプミスであると仮定すると、 'a'が' pivot'に等しいときに何が起こるかを考えます。 –

答えて

5

いずれかの条件(if a < lower_pivotまたはif a > upper_pivotのいずれか)には、同等性テストが含まれている必要があります。

+0

なぜそうですか?私がlower_sorted、pivot、upper_sortedを一緒に連結して返すと、どちらのピボットにピボットを含める必要があるのですか?それで問題は解決しましたので、ありがとうございます。しかし、私はなぜそれを理解するのに苦労しているのでしょうか。 – sToxic5

+3

'ピボット'のコピーが複数ある場合、それらのうちの1つだけが含まれているためです。 – DyZ

関連する問題