【问题标题】:Python Printing a DequePython 打印双端队列
【发布时间】:2023-04-02 22:50:02
【问题描述】:

我有一个完整的 Deque Array 类,如下所示:

from collections import deque
import ctypes

class dequeArray:

DEFAULT_CAPACITY = 10  #moderate capacity for all new queues

def __init__(self):
    self.capacity = 5
    capacity = self.capacity
    self._data = self._make_array(self.capacity)
    self._size = 0
    self._front = 0

def __len__(self):
    return self._size

def __getitem__(self, k):   #Return element at index k
    if not 0 <= k < self._size:
        raise IndexError('invalid index')
    return self._data[k]

def isEmpty(self):
    if self._data == 0:
        return False
    else:
        return True

def append(self, item):  #add an element to the back of the queue
    if self._size == self.capacity:
        self._data.pop(0)
    else:
        avail = (self._front + self._size) % len(self._data)
        self._data[avail] = item
        self._size += 1

#def _resize(self, c):
    #B = self._make_array(c)
    #for k in range(self._size):
        #B[k] = self._A[k]
    #self._data = B
    #self.capacity = capacity

def _make_array(self, c):
    capacity = self.capacity
    return (capacity * ctypes.py_object)()

def removeFirst(self):
    if self._size == self.capacity:
        self._data.pop(0)
    else:
        answer = self._data[self._front]
        self._data[self._front] = None
        self._front = (self._front + 1) % len(self._data)
        self._size -= 1
        print(answer)


def removeLast(self):
    return self._data.popleft()

def __str__(self):
    return str(self._data)

当我尝试在 main 中打印 deque 时,它​​会打印出类似这样的内容,

<bound method dequeArray.__str__ of <__main__.dequeArray object at   0x1053aec88>>

什么时候应该打印整个数组。我想我需要使用 str 功能,我尝试添加

def __str__(self):
    return str(self._data)

这并没有给我输出。我也试过了

def __str__(self):
    return str(d)

d 是双端队列数组,但我仍然没有成功。我怎样才能让它正确打印?

【问题讨论】:

  • 您可能正在尝试print thing.__str__ 而不是thing.__str__()(或只是str(thing))。
  • 请阅读this并提供class的定义
  • @Pynchia 我添加了课程的其余部分,我认为它没有任何用处,因为我只是想弄清楚如何正确打印双端队列
  • 不完整,你只添加了方法。您的电话Deque Array class 为多种可能性敞开大门。请显示它继承自什么
  • ctypes.py_object 正在用锤子杀死一只苍蝇。只需使用对象列表。但真正的问题是为什么你不能使用collections.deque

标签: python arrays queue tostring deque


【解决方案1】:

当我尝试q = dequeArray(); print(q) 时得到的是&lt;__main__.py_object_Array_5 object at 0x006188A0&gt;,这是有道理的。如果你想要它list-like,请使用类似这样的东西(print 隐式使用__str__ 方法):

def __str__(self):
    values = []
    for i in range(5):
        try:
            values.append(self._data[i])
        except ValueError:  # since accessing ctypes array by index 
                            # prior to assignment to this index raises 
                            # the exception
            values.append('NULL (never used)')
    return repr(values)

另外,关于代码的几件事:

from collections import deque

此导入永远不是用户,应该被删除。


DEFAULT_CAPACITY = 10

从未使用过。考虑在__init__中使用它:

def __init__(self, capacity=None):
    self.capacity = capacity or self.DEFAULT_CAPACITY

__init__ 中的这个变量永远不是用户,应该被删除:

capacity = self.capacity

def _make_array(self, c):
    capacity = self.capacity
    return (capacity * ctypes.py_object)()

虽然这是一个有效的代码,但你做错了,除非你在作业中绝对需要这样做。 Ctypes 不应该这样使用,Python 是一种具有自动内存管理的语言。只需return [] 就可以了。是的,变量c 从未使用过,应该从签名中删除。


if self._data == 0

isEmpty 中,总是计算为False,因为您将ctypes 对象与零进行比较,而ctypes 对象绝对不是零。

【讨论】:

  • 谢谢,我会考虑的
【解决方案2】:

你应该调用数组中每个不为NULL的元素的str函数,可以用下面的str函数来完成:

def __str__(self):
    contents = ", ".join(map(str, self._data[:self._size]))
    return "dequeArray[{}]".format(contents)

【讨论】:

  • self._data[:self._size] 如果您尝试在未初始化的ctypes 数组上使用它,则会引发异常。
  • 我不确定您要说什么,即使没有向数组中添加任何元素,上面的代码也不会引发异常。
  • 考虑到 OP 创建他的 self._data 的方式并假装我们在对象实例化后立即调用 __str__self._data[:self._size] 可以简化为抛出 @ 的 (5 * ctypes.py_object)()[:5] 987654328@ 至少在 Python 3.5 上
  • 在对象self._size = 0的实例化之后
  • 啊,确实,你是对的。然后q = dequeArray(); q.append(ctypes.py_object()); print(q) 也会这样做,但这绝对是一个极端和不自然的情况。