簡體   English   中英

使用歸並排序/快速排序對 Python 中 class 對象的屬性進行排序

[英]Using merge sort/quick sort to sort attribute of class objects in Python

我有這個學生 class

class Student:
    def __init__(self, name, id):
        self.name = name
        self.id = id

我需要對學生 class 中的一些對象進行排序,特別是使用合並/快速排序id進行排序,預期結果是學生姓名的數組。 所以如果我有這些對象:

s1 = Student("Andy", 4)
s2 = Student("Bob", 3)
s3 = Student("Sophie", 2)
s4 = Student("Tony", 1)
s5 = Student("Jerry", 5)

和預期的結果:

result = ["Tony", "Sophie", "Bob", "Andy", "Jerry"]

我不確定我是否需要創建 object 數組或我將排序 function 放在哪里。

有什么想法嗎?

您可以使用 is 創建學生列表。 假設您將自己編寫合並排序 function,現在您有一個 function 定義,如下所示:

def merge_sort(students_array)

現在這個 function 應該以特定的方式實現,您可以根據 id 比較元素。

為此,您有幾個選擇:

  1. 有一個 __eq__(支持 a == b 的函數),__le__(支持 a <= b 的函數),__ge__(支持 a >= b 的函數),__gt__(支持 a > b 的函數),__lt__(支持的函數a < b)。 您可以只使用“<、>、=”IMO,但這些是您要考慮的功能。 學生需要實現它們,然后才能通過比較他們的 ID 來比較兩個學生 - 這可能是 go 最 Pythonic 的方式:

示例實現:

class Student:
    def __init__(self, name, id):
        self.name = name
        self.id = id
    def __eq__(self, other):
        return self.id == other.id

    def __gt__(self, other):
        return self.id > other.id

    def __lt__(self, other):
        return self.id < other.id

...
# getting a list of Students, not only ids
def merge_sort(students_array):
...
    # example compare in the sort function
    # this will be translated to: students_array[i].__gt__(students_array[j])
    # which will return: students_array[i] > students_array[j]
    if students_array[i] > students_array[j]:
        # do something
...

def main():

    s1 = Student("Andy", 4)
    s2 = Student("Bob", 3)
    s3 = Student("Sophie", 2)
    s4 = Student("Tony", 1)
    s5 = Student("Jerry", 5)
    students_array = [s1, s2, s3, s4, s5]
    merge_sort(students_array)

關於 python dunder 功能的良好文檔: https://docs.python.org/3/library/operator.ZFC35EZ883622

希望有幫助

將此轉換為對數組,然后應用合並排序並將數組作為參數傳遞

def 合並(arr,l,m,r):n1 = m - l + 1 n2 = r- m

# create temp arrays 
L = [0] * (n1) 
R = [0] * (n2) 

# Copy data to temp arrays L[] and R[] 
for i in range(0 , n1): 
    L[i] = arr[l + i] 

for j in range(0 , n2): 
    R[j] = arr[m + 1 + j] 

# Merge the temp arrays back into arr[l..r] 
i = 0    # Initial index of first subarray 
j = 0    # Initial index of second subarray 
k = l    # Initial index of merged subarray 
enter code here

while i < n1 and j < n2 : 
    if L[i][1] <= R[j][1]: // here you need to compare id
        arr[k] = L[i] 
        i += 1
    else: 
        arr[k] = R[j] 
        j += 1
    k += 1
# Copy the remaining elements of L[], if there 
# are any 
while i < n1: 
    arr[k] = L[i] 
    i += 1
    k += 1
# Copy the remaining elements of R[], if there 
# are any 
while j < n2: 
    arr[k] = R[j] 
    j += 1
    k += 1

def mergeSort(arr,l,r): 
      if l < r: 
        # Same as (l+r)//2, but avoids overflow for 
        # large l and h 
        m = (l+(r-1))//2
        # Sort first and second halves 
        mergeSort(arr, l, m) 
        mergeSort(arr, m+1, r) 
        merge(arr, l, m, r) 

arr = [( "sdas",1), ( "asd3",3), ( "asd1",2)] 
n = len(arr) 
print ("Given array is") 
for i in range(n): 
    print ("%s" %arr[i][0]), 

mergeSort(arr,0,n-1) 
print ("\n\nSorted array is") 
for i in range(n): 
    print (arr[i]), 
#or you can use predefined sort function like this
def sortSecond(val): 
    return val[1] 
arr = [( "sdas",1), ( "asd3",3), ( "asd1",2)] 
# sorts the array in ascending according to 
# second element 
arr.sort(key = sortSecond) 
print(arr) 

暫無
暫無

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

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