Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中交换列表中的值_Python - Fatal编程技术网

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

我是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] = 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]
    arr[-1]
    。Python将负索引解释为“从末尾开始计数”,因此,除非处理得当,否则会导致另一波混乱

    这里的变化是在到达零之前结束
    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]
    arr[-1]
    。Python将负索引解释为“从末尾开始计数”,因此,除非处理得当,否则会导致另一波混乱

    这里的变化是在它达到零之前结束
    j
    ,因此
    范围(i,-1,-1)<