微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python初始化一个类中的列表

如何解决Python初始化一个类中的列表

我正在尝试使用列表解决 leetcode 问题:设计循环队列。

但它抛出一个错误

IndexError: list assignment index out of range
self.queue[self.tail] = value 

我的代码

class MyCircularQueue:

def __init__(self,k: int):
    self.size = k
    self.queue = []
    self.head = -1
    self.tail = -1
    

def enQueue(self,value: int) -> bool:
    if self.tail + 1 == self.head: #queue full
        return False

    elif self.tail + 1 == self.size:
        self.tail = 0
        self.queue[self.tail] = value
        return True
    
    else:
        self.tail += 1
        self.queue[self.tail] = value
        return True
    

def deQueue(self) -> bool:
    if len(self.queue) == 0: #queue empty
        return False
    
    elif self.tail + 1 == self.size:
        self.queue.pop(self.head)
        self.head = -1
        return True
    
    else:
        self.queue.pop(self.head)
        self.head += 1
        return True
    

def Front(self) -> int:
    if self.head == -1:
        return False
    
    return self.queue[self.head]
    

def Rear(self) -> int:
    if self.tail == -1:
        return False
    
    return self.queue[self.tail]
    

def isEmpty(self) -> bool:
    if len(self.queue) == 0:
        return True
    
    return False
    

def isFull(self) -> bool:
    if len(self.queue) == self.size:
        return True
    
    return False

其他类似的帖子说列表可能没有初始化,但我不知道我在这里做错了什么。

问题链接https://leetcode.com/problems/design-circular-queue/


编辑:

正如下面所指出的,append 将是在 Python 中实现它的一种有机方式。但是,我需要索引来实现循环队列,所以我采用了不同的方法

self.tail = (self.tail + 1) % self.size #example circular increment
  1. 用空列表初始化列表
  2. deQueue:用除 pop 外的 None 替换 item

更新代码

class MyCircularQueue:

def __init__(self,k: int):
    self.size = k
    self.queue = [None] * k #replace queue = [] -> add queue[idx] will throw a error
    self.head = -1
    self.tail = -1
    

def enQueue(self,value: int) -> bool:
    if self.isFull() == True: #queue full
        return False
    
    elif self.tail == -1: #add first item
        self.tail += 1
        self.head += 1
        self.queue[self.tail] = value
            
    else: 
        self.tail = (self.tail + 1) % self.size
        self.queue[self.tail] = value
 
    return True
    

def deQueue(self) -> bool:
    if self.isEmpty() == True: #queue empty
        return False
    
    elif self.head == self.tail: #at last item
        self.queue[self.head] = None
        self.head = -1
        self.tail = -1
    
    else:
        self.queue[self.head] = None #replace item with None other than pop,which will remove None from the list
        self.head = (self.head + 1) % self.size #not self.head += 1

    return True
    

def Front(self) -> int:
    if self.head == -1:
        return -1
    
    return self.queue[self.head]
    

def Rear(self) -> int:
    if self.tail == -1:
        return -1
    print(self.tail)
    return self.queue[self.tail]
    

def isEmpty(self) -> bool:
    if self.head == -1:
        return True
    
    return False
    

def isFull(self) -> bool:
    if (self.tail + 1) % self.size == self.head:
        return True
    
    return False

参考:Circular Queue Structure Explanation

解决方法

queue[index] 指列表 index 中的第 queue 项。

如果列表中没有项目,则索引 0 不存在,因此您无法访问 queue[0]

异常“列表分配索引超出范围”在 index >= len(list) 时引发。你将 self.tail 初始化为 0,列表的长度也是 0。

将项目添加到列表最后位置的 Pythonic 方法是使用 list.append

self.queue.append(value)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?