簡體   English   中英

python class 內的合並排序

[英]python merge sort within a class

我正在嘗試使用第一個代碼在 class “python 項目的排序器”中進行合並排序。問題是,每當我初始化代碼時,它都會調用錯誤“merge_sort'未定義”,如果我刪除“merge_sort”並使用“left = lst[:mid]”,它只會將列表切成兩半並重新組織,但不會用整個列表完成腳本。有沒有辦法解決這個問題?謝謝!

from sorter import Sorter
unsorted_list = [5, -3, 4, 10, -14, 2, 4, -5]
my_sorter = Sorter()
my_sorter.unsorted_tuple = tuple(unsorted_list)
sorted_list = my_sorter._merge_sort()
print(sorted_list)

我的代碼:

class Sorter():

    def __init__(self):
        self.unsorted_tuple = tuple([])
        self.algorithm = 'default'

    def generate_new_tuple(self, n):

        new_list = []
        for x in range (0, n):
            new_list.append(random.randint(0, maxsize))
        tuple(new_list)
        self.unsorted_tuple = new_list
        return None

    def _merge_sort(self, reverse=False):

        lst = list(self.unsorted_tuple)
        result = []
        i,j = 0,0

        if(len(lst)<= 1): 
            return lst
        mid = int(len(lst)/2)
        left = _merge_sort(lst[:mid])
        right = _merge_sort(lst[mid:])

        while i<len(left) and j<len(right):
            if left[i] <= right[j]:
                result.append(left[i]) 
                i+=1
            else:
                result.append(right[j])
                j+=1
        result += left[i:]
        result += right[j:]
        return result

您對類和方法的工作方式感到困惑。

編譯器是正確的(根據定義......):沒有 function _merge_sort 該名稱適用於方法,並且必須使用Sorter object 調用。 您在設置此 class 時遇到了很多麻煩,但是當您嘗試在列表的一半上重復時,您忽略了這些封裝保護:

    left = _merge_sort(lst[:mid])
    right = _merge_sort(lst[mid:])

您正在嘗試調用您的方法,就好像它是一個常見的 function。 相反,您必須為列表的每一半實例化Sorter對象,將它們的未排序屬性設置為這些半列表,然后您可以在每個列表上調用該方法。 就像是:

left_half = Sorter()
left_half.unsorted_tuple = lst[:mid]
left = left_half._merge_sort()
right_half = Sorter()
right_half.unsorted_tuple = lst[mid:]
right = right_half._merge_sort()

請考慮此代碼的“重量”; 也許您可以重新配置您的 class 以更好地滿足您的需求。 對於初學者,給__init__另一個參數作為列表/元組的初始值。

這會讓你感動嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM