2017-05-08 57 views
0

我试图插入一个数字,数字序列的列表,由于某种原因,这个小程序只是坐在那里消耗CPU功率......不知道为什么它不工作:Python中插入数字

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) 

预期输出:

lst = [4,5,5,6] 
+0

如果原始列表已经排序,我会建议迭代列表并在第一个元素之前插入'x',它等于或大于。 – Don

+0

@Don yea好点谢谢 – citizen2077

+1

当你迭代它时,你不应该改变'list'。你的代码实际上永远不会前进,因为你不断地插入一个新的数字,并且'v'每次都保持不变。最好创建一个新列表。 – AChampion

回答

2

循环插入数字5到列表中间的时间理论上无限量(或直到您运行的任何有限的资源列表消耗,以先发生者为准) 。

1) for i,v in enumerate(lst): 
2) if v>number: 
3)  lst.insert(i-1,number) 

在第一遍中,第1行开始循环,v = 4,i = 0。第2行发现v不大于数字。

在第二遍中,第1行继续v = 5和i = 1的循环。第2行也是错误的。

第三通,第1行:V = 6,I = 2。第2行找到真实的说明和移动到第3行第3行中插入由引用的对象到位置i - 1,插入到5位置列表中的1个。

此时列表是:

lst = [4, *5*, **5**, 6] 

斜体5您添加到列表中的号码。粗体5表示当前指针所在的位置,i = 2。请注意,我们刚刚检查过的6与插入点向前移动。

第四关:V = 6,I = 3。第2行找到真实的说明和移动到第3行第3行中插入由引用的对象到位置i - 1,插入到5的2位名单。

此时列表是:

lst = [4, 5, *5*, **5**, 6] 

等等等等等等

速战速决:

for i, v in enumerate(lst): 
    if v > number: 
     lst.insert(i-1, number) 
     **break** 

你只是检查和添加单号,所以一旦插入,就会跳出循环,因为你完成了。

+0

yea谢谢,菜鸟错误,接受你的回答 – citizen2077

+0

不会用完堆栈,列表内容不会存储在那里。 –

+0

对于调用堆栈有一些疑问。由于我不知道Python对象的内部运作及其限制,所以我将它改为更一般。 –