Python 二维列表的合并列表,其分离正确,但当它全部返回时,它是错误的,

Python 二维列表的合并列表,其分离正确,但当它全部返回时,它是错误的,,python,recursion,mergesort,Python,Recursion,Mergesort,这是我的代码,代码是通常的合并排序,但是我的打印语句显示了每个步骤,我唯一的问题是当它一起返回时,会有重复的值和类似的东西 def mergeSort(list): if len(list) > 1: mid = len(list) // 2 left = list[:mid] right = list[mid:] print("left:\n"+str(left).replac

这是我的代码,代码是通常的合并排序,但是我的打印语句显示了每个步骤,我唯一的问题是当它一起返回时,会有重复的值和类似的东西

def mergeSort(list):
    if len(list) > 1:
        mid = len(list) // 2 
        left = list[:mid]
        right = list[mid:]
        
        print("left:\n"+str(left).replace("],","]\n")) 
        print("right:\n"+str(right).replace("],","]\n")) 
        print("")
            
        #recursion
        mergeSort(left)
        mergeSort(right)
        
        i = j = k = 0
        
        while i < len(left) and j < len(right):
            if left[i][0] < right[j][0]:
                list[k].append(left[i][0])
                i += 1
            else:
                list[k].append(right[j][0])
                j += 1
            k += 1

        while i < len(left):
            list[k].append(left[i][0])
            i += 1
            k += 1

        while j < len(right):
            list[k].append(right[j][0])
            j += 1
            k += 1

我能够合并排序,如果它只是一个具有相同“第一列值”的数组,这就是我知道它正确分离的原因。我只是看不出我的函数哪里出了问题,也许我就是瞎了。

我在你的代码中发现了三个错误

永远不要在python中调用变量
list
为函数的参数找到另一个名称
list
已经是处理python中与列表相关的所有内容的类的名称。给另一个对象起这个名字会带来意想不到的麻烦。相反,请调用变量
l
,或
ll
,或
myList
,或任何您能想到的其他名称

您正在比较字符串而不是数字 默认情况下,将根据字典顺序对字符串进行比较。因此,
'2'>'18'
,因为
'2'
以字符
'2'
开头,而
'18'
以字符
'1'
开头。这很可能不是你想要的。您可以在排序前修改列表,用数字替换这些字符串;或者您可以用
if int(left[i][0]
替换测试
if-int(left[i][0])

您的合并函数在错误的位置追加了错误的内容 让我用python的交互式解释器来说明行
list[k].append(左[i][0])
的效果:

>>左=[[21]、[John]、[S.”、[100.00]、[20]、[Mark]、[Z.”、[123.00]、[18]、[Susan]、[K.”、[0.00']
>>>myList=['21','John','S','100.00'],['20','Mark','Z','123.00'],['18','Susan','K','0.00'],['25','Paul','A','0.00'],['44','Elvis','P','4000.00'],['8','Lucas L','5.00']
>>>i=0
>>>k=0
>>>myList[k].追加(左[i][0])
>>>迈利斯特
[21]、[John]、[S]、[100.00]、[21],
[20'、'Mark'、'Z'、'123.00'],
[18]、[Susan]、[K]、[0.00美元],
[25]、[Paul]、[A]、[0.00美元],
[44]、“猫王”、“P.”、“$4000.00”],
['8','Lucas','L','5.00']
发生了什么事?
myList[k]
myList
的一个元素:因为
myList
是一个列表列表,在本例中,它是对应于John的列表
left[i]
left
的第一个元素;由于
left
是一个列表列表,因此在本例中,它是对应于John的列表。最后,
left[i][0]
是John列表的第一个元素,即字符串
'21'
。因此,您将元素
'21'
添加到列表
['21',John','S.','$100.00']
,这将导致
myList
中的John列表变成
['21','John','S.','100.00','21']


如何修复它?只需编写
myList[k]=left[i]
。这将用
left
的第i个元素替换
myList的第k个元素,这是您想要的。

永远不要在python中调用变量
list
。此名称已用于类
list
。行
list[k].append(左[i][0])
是错误的。它应该是简单的
list[k]=left[i]
。哇,谢谢你的帮助和解释,我能够修复我的程序,当我编写这个程序时已经很晚了,所以很多事情都超出了我的想象。如果我能投票,我会的!
left:
[['21', 'John', 'S.', '$100.00']
 ['20', 'Mark', 'Z.', '$123.00']
 ['18', 'Susan', 'K.', '$0.00']]
right:
[['25', 'Paul', 'A.', '$0.00']
 ['44', 'Elvis', 'P.', '$4,000.00']
 ['8', 'Lucas', 'L.', '$5.00']]

left:
[['21', 'John', 'S.', '$100.00']]
right:
[['20', 'Mark', 'Z.', '$123.00']
 ['18', 'Susan', 'K.', '$0.00']]

left:
[['20', 'Mark', 'Z.', '$123.00']]
right:
[['18', 'Susan', 'K.', '$0.00']]

left:
[['25', 'Paul', 'A.', '$0.00']]
right:
[['44', 'Elvis', 'P.', '$4,000.00']
 ['8', 'Lucas', 'L.', '$5.00']]

left:
[['44', 'Elvis', 'P.', '$4,000.00']]
right:
[['8', 'Lucas', 'L.', '$5.00']]

[['21', 'John', 'S.', '$100.00', '20', '21']
 ['20', 'Mark', 'Z.', '$123.00', '18', '18', '20']
 ['18', 'Susan', 'K.', '$0.00', '20', '21', '18']
 ['25', 'Paul', 'A.', '$0.00', '25', '25']
 ['44', 'Elvis', 'P.', '$4,000.00', '44', '44', '44']
 ['8', 'Lucas', 'L.', '$5.00', '8', '8', '8']]