在Python中交换列表中的值
我是python的初学者。这是一个插入排序I代码。print()显示我通过比较交换值。但当我返回它时,它会给出原始数组。我想知道我制造的虫子在哪里。在python中这样交换值的用法正确吗在Python中交换列表中的值,python,Python,我是python的初学者。这是一个插入排序I代码。print()显示我通过比较交换值。但当我返回它时,它会给出原始数组。我想知道我制造的虫子在哪里。在python中这样交换值的用法正确吗 def insert_sort(arr): for i in range(len(arr)): for j in range(i, -1, -1): if arr[j] < arr[j-1]: arr[j-1], arr[j]
def insert_sort(arr):
for i in range(len(arr)):
for j in range(i, -1, -1):
if arr[j] < arr[j-1]:
arr[j-1], arr[j] = arr[j], arr[j-1]
print(arr)
return arr
insert_sort([5,4,3,2,1])
::[5,4,3,2,1]
def插入排序(arr):
对于范围内的i(len(arr)):
对于范围(i,-1,-1)内的j:
如果arr[j]
你离得太近了!代码的问题在于,内部循环允许j
为0
。这意味着您将比较arr[0]
和arr[-1]
。这在Python中不会崩溃,但也不会做您想要做的事情,因为您正在比较数组中的第一个值和最后一个值。您只需将内部循环限制为在1
处停止,代码即可正常工作:
def insert_sort(arr):
for i in range(len(arr)):
for j in range(i, 0, -1): # <- changed "-1" to "0" here
if arr[j] < arr[j - 1]:
arr[j - 1], arr[j] = arr[j], arr[j - 1]
print(arr)
return arr
r = insert_sort([5,4,3,2,1])
print("Result:", r)
我强烈建议您熟悉可视化调试器,并将其广泛应用于您的工作中。我没有完全理解代码来找出这里出了什么问题。相反,我只是在比较行上放置了一个断点,这是整个算法的核心,并查看了每次命中该行时的条件。我立即看到j
的值为0
,因此arr[j-1]
看起来是错误的。我在不到30秒的时间内完成了所有这一切,再一次,我不需要知道任何关于代码的知识就可以发现这个问题
更新:我刚刚看到@iBug的评论,您的第一次外循环迭代是不必要的。我同意。您应该做出这样的更改,使您的代码最“正确”,效率更高。但是,请注意,额外的循环迭代不会造成任何伤害。这只是一个退化情况,它什么也不做,因为该情况下的内部循环在
范围(0,0,-1)
上迭代,从而生成一个空序列。如果您在调试器中逐步执行代码,那么这是另一件很容易捕捉到的事情。您将看到,第一次外部迭代根本没有击中if
语句。您太接近了!代码的问题在于,内部循环允许j
为0
。这意味着您将比较arr[0]
和arr[-1]
。这在Python中不会崩溃,但也不会做您想要做的事情,因为您正在比较数组中的第一个值和最后一个值。您只需将内部循环限制为在1
处停止,代码即可正常工作:
def insert_sort(arr):
for i in range(len(arr)):
for j in range(i, 0, -1): # <- changed "-1" to "0" here
if arr[j] < arr[j - 1]:
arr[j - 1], arr[j] = arr[j], arr[j - 1]
print(arr)
return arr
r = insert_sort([5,4,3,2,1])
print("Result:", r)
我强烈建议您熟悉可视化调试器,并将其广泛应用于您的工作中。我没有完全理解代码来找出这里出了什么问题。相反,我只是在比较行上放置了一个断点,这是整个算法的核心,并查看了每次命中该行时的条件。我立即看到j
的值为0
,因此arr[j-1]
看起来是错误的。我在不到30秒的时间内完成了所有这一切,再一次,我不需要知道任何关于代码的知识就可以发现这个问题
更新:我刚刚看到@iBug的评论,您的第一次外循环迭代是不必要的。我同意。您应该做出这样的更改,使您的代码最“正确”,效率更高。但是,请注意,额外的循环迭代不会造成任何伤害。这只是一个退化情况,它什么也不做,因为该情况下的内部循环在
范围(0,0,-1)
上迭代,从而生成一个空序列。如果您在调试器中逐步执行代码,那么这是另一件很容易捕捉到的事情。你会看到,第一次外部迭代根本没有触及到if
语句。在我刚开始学习编程时,处理算法的边缘是一件非常痛苦的事情,我相信这次你也是
这里需要注意的两件事是
- 您在第二个元素开始“插入”,因为第一个元素总是“自行排序”。因此,您应该将外部循环的
更改为range(len(arr))
range(1,len(arr))
- 最后比较和交换前两个元素,即
和arr[0]
,非arr[1]
和arr[0]
。Python将负索引解释为“从末尾开始计数”,因此,除非处理得当,否则会导致另一波混乱 这里的变化是在到达零之前结束arr[-1]
,因此j
应该是范围(i,-1,-1)
范围(i,0,-1)
def插入排序(arr):
对于范围(1,len(arr))中的i:#从1开始i
对于范围(i,0,-1)内的j:#在1处结束j
如果arr[j]
当我刚开始学习编程时,处理算法的边缘曾经是一件非常痛苦的事情,我相信这次你也是
这里需要注意的两件事是
- 您在第二个元素开始“插入”,因为第一个元素总是“自行排序”。因此,您应该将外部循环的
更改为range(len(arr))
range(1,len(arr))
- 最后比较和交换前两个元素,即
和arr[0]
,非arr[1]
和arr[0]
。Python将负索引解释为“从末尾开始计数”,因此,除非处理得当,否则会导致另一波混乱 这里的变化是在它达到零之前结束arr[-1]
,因此j
范围(i,-1,-1)<