簡體   English   中英

根據相關列表對具有重復項的列表進行排序

[英]Sort List with duplicates based on related list

為簡潔起見縮短了場景。

我有三個 arrays

A1 = [A,B,C,D,E,F]
A2 = [20,30,45,60,20,10]
A3 = [30,30,15,20,40,60]

其中三個 arrays 之間的i-th position 的元素之間存在關系。

例如, A1[0]A2[0]以及A3[0]等相關......

我想根據 A2(按升序)對三個 arrays 進行排序。

所以排序后,arrays 變成

A1 = [F,A,E,B,C,D]
A2 = [10,20,20,30,45,60]
A3 = [60,30,40,30,15,20]

我無法弄清楚的一件事是,在排序時,如果 A2 中有重復記錄(在本例中為 20),那么排序應該采用 A2 中的值,而 A3 中的對應值較小。這就是為什么在最終的 A1 列表中,A 應該排在 E 之前。

任何幫助,將不勝感激。

截至目前,我正在嘗試使用快速排序來做到這一點,請在下面找到我的代碼

    def partition(self, A1, A2, A3, low, high):
        pivot = A2[high]
        i = low - 1
        for j in range(low, high):
            if A2[j] <= pivot:
                i = i + 1
                (A2[i], A2[j]) = (A2[j], A2[i])
                (A3[i], A3[j]) = (A3[j], A3[i])
                (A1[i], A1[j]) = (A1[j], A1[i])
        (A2[i + 1], A2[high]) = (A2[high], A2[i + 1])
        (A3[i + 1], A3[high]) = (A3[high], A3[i + 1])
        (A1[i + 1], A1[high]) = (A1[high], A1[i + 1])
        return i + 1

    def quickSort(self, A1, A2, A3, low, high):
        if low < high:
            pi = self.partition(A1, A2, A3, low, high)
            self.quickSort(A1, A2, A3, low, pi - 1)
            self.quickSort(A1, A2, A3, pi + 1, high)

請注意:我必須在不使用內置函數的情況下執行此操作

A2, A3, A1 =  map(list, zip(*sorted(zip(A2, A3, A1))))

而且由於您需要它而沒有內置功能:

A1 = ['A', 'B', 'C', 'D', 'E', 'F']
A2 = [20, 30, 45, 60, 20, 10]
A3 = [30, 30, 15, 20, 40, 60]

def myzip(*iterables):
    myiters = [myiter(it) for it in iterables]
    try:
        while True:
            yield tuple(mynext(it) for it in myiters)
    except RuntimeError:
        pass

def mymap(func, *iterables):
    myiters = [myiter(it) for it in iterables]
    try:
        while True:
            yield func(*(mynext(it) for it in myiters))
    except RuntimeError:
        pass  

def mylist(*args):
    return [*args]

def myiter(iterable):
    for item in iterable:
        yield item
    raise StopIteration()

def mynext(it):
    return it.__next__()

def _partition(l, r, arr):
    pivot, ptr = arr[r], l
    for i in range(l, r):
        if arr[i] <= pivot:
            arr[i], arr[ptr] = arr[ptr], arr[i]
            ptr += 1
    arr[ptr], arr[r] = arr[r], arr[ptr]
    return ptr

def _quicksort(l, r, arr):
    if len(arr) == 1: 
        return arr
    if l < r:
        pi = _partition(l, r, arr)
        _quicksort(l, pi-1, arr) 
        _quicksort(pi+1, r, arr) 
    return arr

def quicksort(arr):
    arr = list(arr)
    return _quicksort(0, len(arr)-1, arr)

A2, A3, A1 =  mymap(mylist, myzip(*quicksort(myzip(A2, A3, A1))))

print(A1, A2, A3, sep='\n')

導致

['F', 'A', 'E', 'B', 'C', 'D']
[10, 20, 20, 30, 45, 60]
[60, 30, 40, 30, 15, 20]

注意:我在重新實現內置插件時采取了一些捷徑。 它們的異常處理不太理想,缺少一些功能,並且行為不完全相同,但它們可以達到預期目的。

注意 2range()print()沒有重新實現。

暫無
暫無

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

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