Python 在 class 中初始化列表
Python initialize a list in a class
我正在尝试使用列表解决 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
其他类似的帖子说可能列表没有初始化,但我不知道我在这里做错了什么。
问题link:https://leetcode.com/problems/design-circular-queue/
编辑:
如下所述,append
将是 Python 中的一种有机方式。但是,我需要索引来实现循环队列,所以我采用了不同的方法:
self.tail = (self.tail + 1) % self.size #example circular increment
- 用 None 初始化列表而不是空列表
- deQueue:用 None 代替
pop
以外的项目
更新代码:
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
queue[index]
指的是列表 queue
中的第 index
项。
如果列表中没有项目,则索引 0
不存在,因此您无法访问 queue[0]
。
index >= len(list)
时出现异常“列表分配索引超出范围”。你初始化self.tail
为0,列表长度也为0。
将项目添加到列表最后位置的 Pythonic 方法是使用 list.append
:
self.queue.append(value)
我正在尝试使用列表解决 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
其他类似的帖子说可能列表没有初始化,但我不知道我在这里做错了什么。
问题link:https://leetcode.com/problems/design-circular-queue/
编辑:
如下所述,append
将是 Python 中的一种有机方式。但是,我需要索引来实现循环队列,所以我采用了不同的方法:
self.tail = (self.tail + 1) % self.size #example circular increment
- 用 None 初始化列表而不是空列表
- deQueue:用 None 代替
pop
以外的项目
更新代码:
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
queue[index]
指的是列表 queue
中的第 index
项。
如果列表中没有项目,则索引 0
不存在,因此您无法访问 queue[0]
。
index >= len(list)
时出现异常“列表分配索引超出范围”。你初始化self.tail
为0,列表长度也为0。
将项目添加到列表最后位置的 Pythonic 方法是使用 list.append
:
self.queue.append(value)