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']]