从python中的队列中提取

时间:2018-01-27 15:19:05

标签: python queue

我在尝试从队列中提取元素直到给定数字时遇到问题。如果给定的数字没有排队,则代码应该将队列留空并给出一条消息说明。

相反,我收到此错误消息,但我无法解决它:

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)

4 个答案:

答案 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

尝试使用其他建议的代码段之一。