Python按列表顺序插入数字
我正在尝试将一个数字插入一系列数字的列表中,出于某种原因,这个小程序只是坐在那里消耗CPU功率。。。不知道为什么它不起作用:Python按列表顺序插入数字,python,list,Python,List,我正在尝试将一个数字插入一系列数字的列表中,出于某种原因,这个小程序只是坐在那里消耗CPU功率。。。不知道为什么它不起作用: number = 5 lst = [4,5,6] if all(x > number for x in lst): lst.insert(0,number) elif all(x < number for x in lst): lst.append(number) else: for i,v in enumerate(lst):
number = 5
lst = [4,5,6]
if all(x > number for x in lst):
lst.insert(0,number)
elif all(x < number for x in lst):
lst.append(number)
else:
for i,v in enumerate(lst):
if v>number:
lst.insert(i-1,number)
print (lst)
for循环在理论上无限次地将数字5插入列表中间(或者直到列表消耗的有限资源用完为止,以先发生的为准)
第一次通过时,第1行以v=4和i=0开始循环。第2行发现v不大于数字
在第二次循环中,第1行继续循环,v=5,i=1。第2行也是错误的
第三遍,第1行:v=6,i=2。第2行找到一个true语句并移到第3行。第3行将编号引用的对象插入位置i-1,将5插入列表的位置1
此时,列表为:
lst = [4, *5*, **5**, 6]
lst = [4, 5, *5*, **5**, 6]
斜体5是您添加到列表中的数字。粗体5是当前指针所在的位置,i=2。请注意,我们刚刚检查的6已随着插入向前移动
第四遍:v=6,i=3。第2行找到一个true语句并移到第3行。第3行将编号引用的对象插入位置i-1,将5插入列表的位置2
此时,列表为:
lst = [4, *5*, **5**, 6]
lst = [4, 5, *5*, **5**, 6]
等等等等等等
快速修复:
for i, v in enumerate(lst):
if v > number:
lst.insert(i-1, number)
**break**
您只需检查并添加一个数字,因此一旦插入循环,就可以中断循环。您的for循环在理论上无限次地将数字5插入列表中间(或者直到列表消耗的有限资源用完为止,以先发生的为准)
第一次通过时,第1行以v=4和i=0开始循环。第2行发现v不大于数字
在第二次循环中,第1行继续循环,v=5,i=1。第2行也是错误的
第三遍,第1行:v=6,i=2。第2行找到一个true语句并移到第3行。第3行将编号引用的对象插入位置i-1,将5插入列表的位置1
此时,列表为:
lst = [4, *5*, **5**, 6]
lst = [4, 5, *5*, **5**, 6]
斜体5是您添加到列表中的数字。粗体5是当前指针所在的位置,i=2。请注意,我们刚刚检查的6已随着插入向前移动
第四遍:v=6,i=3。第2行找到一个true语句并移到第3行。第3行将编号引用的对象插入位置i-1,将5插入列表的位置2
此时,列表为:
lst = [4, *5*, **5**, 6]
lst = [4, 5, *5*, **5**, 6]
等等等等等等
快速修复:
for i, v in enumerate(lst):
if v > number:
lst.insert(i-1, number)
**break**
您只需检查并添加一个数字,因此一旦插入它,就可以中断循环,因为您已经完成了。您不应该在迭代时更改
列表。您的代码实际上从未向前移动,因为您一直在插入一个新的数字,v
每次都保持不变。最好创建一个新列表。只是为了确保,您正在尝试向列表中添加一个数字并保持其排序?您还可以查看对分
库:@Don这对于大型列表不是一个好主意,因为时间复杂度为O(n)。如果已经排序,二进制搜索可以在O(logn)时间内完成。虽然这可能不是最有效的方法,但您可以添加数字进行排序。ej:list=[1,3,2]
然后添加任何您想要的list.append(2)
和sortlist.sort()
这应该输出[1,2,2,3]
在迭代过程中不应该更改列表。您的代码实际上从未向前移动,因为您一直在插入一个新的数字,v
每次都保持不变。最好创建一个新列表。只是为了确保,您正在尝试向列表中添加一个数字并保持其排序?您还可以查看对分
库:@Don这对于大型列表不是一个好主意,因为时间复杂度为O(n)。如果已经排序,二进制搜索可以在O(logn)时间内完成。虽然这可能不是最有效的方法,但您可以添加数字进行排序。ej:list=[1,3,2]
然后添加您想要的任何内容list.append(2)
和sortlist.sort()
这应该输出[1,2,2,3]
不会耗尽堆栈,列表内容不会存储在那里。对调用堆栈有一些疑问。因为我还不知道Python对象的内部工作方式及其限制,所以我将其更改为更一般的方式。不会耗尽堆栈,列表内容不会存储在那里。对调用堆栈有一些疑问。因为我还不知道Python对象的内部工作方式及其限制,所以我将其更改为更一般的方式。