使用非库存排序函数(Python)对元组列表进行排序

时间:2018-04-28 10:57:28

标签: python sorting

由于上面提到的问题,我需要使用非库存排序函数,特别是我在之前的赋值中实现的mergesort函数。我使用activity_arr.sort(key=operator.itemgetter(2))完成了我的作业。但是,要求是要求我使用此功能:

def merge_sort(array):
''' Sorts an array using merge sort algorithm.'''
if len(array) > 1:
    # '//' is for "floor division", used in case array is filled with floats
    mid = len(array) // 2
    left = array[:mid]
    right = array[mid:]

    # Recursion to sort left and right half of array
    merge_sort(left)
    merge_sort(right)

    i = 0
    j = 0
    k = 0

    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            array[k] = left[i]
            i += 1
        else:
            array[k] = right[j]
            j += 1
        k += 1
    # Fill the rest of the array with remaining numbers in each array
    while i < len(left):
        array[k] = left[i]
        i += 1
        k += 1
    while j < len(right):
        array[k] = right[j]
        j += 1
        k += 1

我假设,我将不得不修改它,以便我可以对元组列表进行排序。我要排序的列表的一个示例是example_list = [(1, 3, 4), (7, 2, 5), (1, 2, 1)]。我想按元组的第三个元素按升序排序。因此,它应该导致以下结果:sorted_list = [(1, 2, 1), (1, 3, 4), (7, 2, 5)]

我仍然只是在学习python,并且在CS中仍然需要学习很多东西。我不知道如何进行这项改变,尽管有很多研究我大多数人都会说要使用.sort()。如果我遗漏了任何重要的信息,请告诉我!我将非常感谢任何帮助或信息让我查阅。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以传递一个索引,根据该索引对元组数组进行排序。 例如,如果要基于索引2对索引进行排序(索引从0开始),则可以将其用作:merge_sort(example_list,2)。想法很简单,你必须根据给定的索引比较元素,就像我在这里做的那样:     if left[i][index] < right[j][index]:

def merge_sort(array,index):         #edit here
''' Sorts an array using merge sort algorithm.'''
if len(array) > 1:
    # '//' is for "floor division", used in case array is filled with floats
    mid = len(array) // 2
    left = array[:mid]
    right = array[mid:]

    # Recursion to sort left and right half of array
    merge_sort(left,index)        #edit here
    merge_sort(right,index)       #edit here

    i = 0
    j = 0
    k = 0

    while i < len(left) and j < len(right):
        if left[i][index] < right[j][index]:      #edit here
            array[k] = left[i]
            i += 1
        else:
            array[k] = right[j]
            j += 1
        k += 1
    # Fill the rest of the array with remaining numbers in each array
    while i < len(left):
        array[k] = left[i]
        i += 1
        k += 1
    while j < len(right):
        array[k] = right[j]
        j += 1
        k += 1