Python 限制链接列表中的节点
是否可以限制保存在链表中的节点 为简单起见,请以下面的示例为例:Python 限制链接列表中的节点,python,linked-list,queue,heap,Python,Linked List,Queue,Heap,是否可以限制保存在链表中的节点 为简单起见,请以下面的示例为例: import numpy as np class LinkedList(): def __init__(self,data,prev): self.data = data self.prev = prev myData_prev = None for x in range(10): data = np.random.random((3,2)) myData = Link
import numpy as np
class LinkedList():
def __init__(self,data,prev):
self.data = data
self.prev = prev
myData_prev = None
for x in range(10):
data = np.random.random((3,2))
myData = LinkedList(data,myData_prev)
myData_prev = myData
print(myData.data)
print(myData.prev.data)
print(myData.prev.prev.data)
print(myData.prev.prev.prev.data) ## DELETED OR NO LONGER AVAILABLE
假设“数据”相当大或范围不确定。是否可以限制存储在内存中的节点?为简单起见,假设我只需要最新的3个节点或30%
我想我有两个问题。首先,如何解决上述问题,保持链表方法。第二,有没有更好的方法不使用链表。我想我可以使用一个有限制的queue/deque或heapq,但是要获得与另一个相关的数据会有点困难,对吗
class Node:
def __init__(self, data=None, next=None):
self.data = data
self.next = next
def __repr__(self):
return 'Node({}, {})'.format(self.data, self.next)
class LinkedList:
def __init__(self, iterable=(), maxlen=3):
self.head = None
self.length = 0
if maxlen < 2:
raise ValueError
self.maxlen = maxlen
for item in iterable:
self.add(item)
def add(self, data):
self._check_and_remove_last()
self.head = Node(data, self.head)
self.length += 1
def _check_and_remove_last(self):
if self.length < self.maxlen:
return
new_tail = self.head
while new_tail.next.next:
new_tail = new_tail.next
# new_tail.next is now the last Node in the Linked List
new_tail.next = None
self.length -= 1
删除链表的最后一个元素意味着您必须跟踪链表中倒数第二个节点(这不是很自然的事情),或者每次遍历整个链表。您可以通过使用双链接列表并执行self.tail.prev.next=None之类的操作来解决此问题,或者只使用内置的使所有这一切变得轻而易举的方法来解决此问题您的问题并不清楚:如果您想限制列表中的节点数,当然可以这样做,如何实现它取决于您:如果它已满,您可以忽略添加新节点的请求,删除最旧的节点,等等。如果您想控制内存中的内容和不在内存中的内容,那么在Python中它是不可行的,但即使它会,也没有任何意义。如果您想在较低级别上工作,请使用较低级别的语言。您是否有真正的理由提出这样的要求?您是否对应用程序进行了基准测试,测量了使用的内存,并发现这是一个瓶颈?链表不是一个很好的数据结构。这是可行的,但你可能正在寻找一个新的链接。我如何从链接列表中“删除”最老的链接?我没有进行基准测试,但我可以看到运行程序时使用的内存高达4GB。这是一个编程游戏,我试图实现机器学习。没有必要保留很多次之前的非常旧的输入数据,这就是我希望限制保留的节点的原因。没有必要,它仍然有效,只是想知道它是否可能。好的,谢谢你给我展示了一个可能的实现。但我想链表并不是解决这个问题的好办法。再次感谢