Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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_List - Fatal编程技术网

Python按列表顺序插入数字

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):

我正在尝试将一个数字插入一系列数字的列表中,出于某种原因,这个小程序只是坐在那里消耗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):
        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)
和sort
list.sort()
这应该输出
[1,2,2,3]
在迭代过程中不应该更改
列表。您的代码实际上从未向前移动,因为您一直在插入一个新的数字,
v
每次都保持不变。最好创建一个新列表。只是为了确保,您正在尝试向列表中添加一个数字并保持其排序?您还可以查看
对分
库:@Don这对于大型列表不是一个好主意,因为时间复杂度为O(n)。如果已经排序,二进制搜索可以在O(logn)时间内完成。虽然这可能不是最有效的方法,但您可以添加数字进行排序。ej:
list=[1,3,2]
然后添加您想要的任何内容
list.append(2)
和sort
list.sort()
这应该输出
[1,2,2,3]
不会耗尽堆栈,列表内容不会存储在那里。对调用堆栈有一些疑问。因为我还不知道Python对象的内部工作方式及其限制,所以我将其更改为更一般的方式。不会耗尽堆栈,列表内容不会存储在那里。对调用堆栈有一些疑问。因为我还不知道Python对象的内部工作方式及其限制,所以我将其更改为更一般的方式。