在Python中,将两个元组的第二个元素与“<”进行比较失败

2024-09-30 23:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python编写一个merge sort函数,它接受一个列表和一个比较函数:

def sort(unsorted, comp_func=lambda x, y: x < y):

    length = len(unsorted)
    if length  <= 1: return unsorted

    halflen = length / 2
    lsorted= sort(unsorted[:halflen])
    rsorted = sort(unsorted[halflen:])
    combined = []

    while True: 
        if len(lsorted) > 0:
            if len(rsorted) > 0 and comp_func(rsorted[0], lsorted[0]):
                combined.append(rsorted[0])
                rsorted = rsorted[1:]
            else:
                combined.append(lsorted[0])
                lsorted = lsorted[1:]
        elif len(rsorted) > 0:
            combined.append(rsorted[0])
            rsorted = rsorted[1:]
        else:
            break

    return combined

它可以很好地处理int的列表(使用默认的comp_func),以及比较函数比较此类元组的第一个元素时具有2int的元组列表。在

^{pr2}$

但是当我编写比较函数来比较元组的第二个元素时,返回的列表仍然是未排序的版本。在

comp_func = lambda x, y: x[1] < y[1]

但是,如果我将“<;”运算符更改为“>;”,以便对列表进行递减排序,则可以:

comp_func = lambda x, y: x[1] > y[1]

不知道为什么在元组的第二个元素上“<;”失败。。。在

在寻找了一个可能的解释后,我发现了这个:Does python think 10 is less than 9。然而,情况并非如此;正在排序的列表包含int的元组,而不是string。在


Tags: lambda函数列表lenifsortlength元组
1条回答
网友
1楼 · 发布于 2024-09-30 23:34:57

实际上,您并没有显示您如何更改运算符的记录,所以这只是一个猜测,但是请注意这两行代码

lsorted= sort(unsorted[:halflen])
rsorted = sort(unsorted[halflen:])

不要超过补偿功能。如果你这样做:

^{pr2}$

你会得到不一致的结果,因为有一半的时间它是用不同的comp_func排序的。在lsorted=rsorted=行中传递comp\u func可以修复此问题:

>>> sort([(3,4),(1,2), (2,3)],lambda x,y: x[1] > y[1])
[(3, 4), (2, 3), (1, 2)]

相关问题 更多 >