我在尝试从队列中提取元素直到给定数字时遇到问题。如果给定的数字没有排队,则代码应该将队列留空并给出一条消息说明。
相反,我收到此错误消息,但我无法解决它:
Traceback (most recent call last):
File "python", line 45, in <module>
IndexError: list index out of range
这是我目前的代码:
class Queue():
def __init__(self):
self.items = []
def empty(self):
if self.items == []:
return True
else:
return False
def insert(self, value):
self.items.append(value)
def extract(self):
try:
return self.items.pop(0)
except:
raise ValueError("Empty queue")
def last(self):
if self.empty():
return None
else:
return self.items[0]
import random
def randomlist(n2,a2,b2):
list = [0] * n2
for i in range(n2):
list[i] = random.randint(a2,b2)
return list
queue1=Queue()
for i in range (0,10):
queue1.insert(randomlist(10,1,70)[i])
if queue1.empty()==False :
print("These are the numbers of your queue:\n",queue1.items)
test1=True
while test1==True:
s=(input("Input a number:\n"))
if s.isdigit()==True :
test1=False
s2=int(s)
else:
print("Wrong, try again\n")
for i in range (0,10) :
if queue1.items[i]!=s2 :
queue1.extract()
elif queue1.items[i]==s2 :
queue1.extract()
print ("Remaining numbers:\n",queue1.items)
break
if queue1.empty()==True :
print ("Queue is empty now", cola1.items)
答案 0 :(得分:1)
通过修改列表是一个坏主意。
for i in range (0,10) :
if queue1.items[i]!=s2 :
queue1.extract()
elif queue1.items[i]==s2 :
queue1.extract()
print ("Remaining numbers:\n",queue1.items)
此代码会修改您的队列 - 项目,它会缩短项目列表,但如果找不到任何项目,您仍会在整个范围内进行迭代。因此,您的内部列表将越来越短,您的范围(i)向i前进。
当您访问不再在队列中的items[i]
时,有些人。
解决方案(感谢Stefan Pochmann's评论编辑):
for _ in range(len(queue1.items)): # no hardcoded length anymore
item = queue1.extract() # pop item
if item == s2 : # check item for break criteria
print ("Remaining numbers:\n",queue1.items)
break
答案 1 :(得分:1)
从队列中提取元素直到给定数字。如果给定的数字没有排队,则代码应该将队列留空并给出一条消息说明。
while not queue.empty():
if queue.extract() == target:
print('Found! Remaining numbers:', queue.items)
break
else:
print('Not found! Remaining numbers:', queue.items)
答案 2 :(得分:0)
您可以尝试替换代码的最后一部分,即
for i in range (0,10) :
if queue1.items[i]!=s2 :
queue1.extract()
elif queue1.items[i]==s2 :
queue1.extract()
print ("Remaining numbers:\n",queue1.items)
break
if queue1.empty()==True :
print ("Queue is empty now", cola1.items)
与
poptill = -1 # index till where we should pop
for i in range(0,len(queue1.items)): # this loop finds the index to pop queue till
if queue1.items[i]==s2:
poptill = i
break
if poptill != -1: # if item to pop was found in queue
i = 0
while i <= poptill: # this loop empties the queue till that index
queue1.extract()
i += 1
if queue1.empty()==True :
print ("Queue is empty now", queue1.items)
else:
print ("Remaining numbers:\n",queue1.items)
else: # else item was not found in list
for i in range(0,len(queue1.items)): # this loop empties the queue
queue1.extract()
print ("no item found, so emptied the list, numbers:\n",queue1.items)
这里我们找到索引位置,直到我们应该在第一个循环中弹出,然后在第二个循环中弹出队列直到该索引,最后如果在列表中找不到弹出的项目我们在第三个循环中清空列表
答案 3 :(得分:0)
测试代码的操作范围是0到10,但是当你提取一个元素时,会减少队列的大小。
因此,如果队列最初为10个元素长,则您提供的索引i
最终将为>=
队列的长度。
因此IndexError
。
尝试使用其他建议的代码段之一。