我只是想将两个排序列表合并为一个排序列表。我知道这是一项简单的任务,并且在线提供了大量解决方案,但是我的问题有所不同。这是我的代码:
def merge(list1, list2):
len1 = len(list1)
len2 = len(list2)
list3 = []
pointer = 0
for i in range(len1):
if (list1[i] >= list2[pointer]):
while (pointer < len2 and list1[i] >= list2[pointer]):
list3.append(list2[pointer])
pointer += 1
i -= 1
else:
list3.append(list1[i])
while (pointer < len2):
list3.append(list2[pointer])
pointer += 1
return list3
if __name__ == "__main__":
print(merge([1, 2, 3, 10, 11, 22], [4, 5, 6, 7, 20, 21, 30]))
我进行了调试,但感到困惑的是,当我将i减1(例如,从3减为2)时,在下一次迭代时又回到了4。我不知道为什么?您可以通过运行代码并查看结果来进行检查。我只需要解释为什么会这样。谢谢
答案 0 :(得分:3)
我很困惑地看到,当我将值i减1(例如,从3减为2)时,在下一次迭代时它又回到了4。我不知道为什么吗?
因为for i in range(x)
的意思是“假设{0到x-1的值为for
,执行i
主体”。为i
分配一个不同的值不会在下一次迭代中影响其值。
换句话说,for i in range(10)
不是是C或JavaScript的for (i = 0; i < 10; i++)
的翻译。相反,您可以将其视为for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。如此看来,很明显,更改i
的一个值不会影响随后的值,该值会从预先生成的列表中盲目取出。如果需要根据不断变化的条件修改迭代进度,则可以显式编写C / JS样式的循环:
i = 0
while i < len1:
# ... loop body goes here ...
i += 1
这样写,修改循环体中的i
将以您期望的方式影响迭代。
答案 1 :(得分:0)
这是因为range()
是生成器函数。它不会像您期望的那样创建数字列表,而是根据需要生成一个新数字。而且,即使它创建了列表,这些数字也会从列表中一个接一个地获取,无论您如何修改它们。您可以将range()
的结果视为“只读”。下面的user4815162342是正确的,您不应将其与C样式的循环混淆。更像是Fortran循环,其中迭代次数是预先计算的。
来自https://pynative.com/python-range-function/:
Python 3的范围使用生成器。当进行循环迭代时,Python 3的range()将产生值。即,range()不会一次产生所有数字。
Python range()函数返回一个不可变的整数序列对象,因此可以将range()输出转换为Python列表。使用列表类将范围输出转换为列表。让我们通过以下示例对此进行理解。
答案 2 :(得分:0)
您正在i
上运行的for循环内编辑i
。我不相信它会按照您的预期工作。
此外,您可以简单地合并列表并使用以下方法对结果进行排序:
list1 = [1,2,3,10,11,22]
list2 = [4,5,6,7,20,21,30]
list3 = list1 + list2
list3.sort()
print(list3)
希望这会有所帮助。