gpt4 book ai didi

链表元素上的 Python 迭代器

转载 作者:太空狗 更新时间:2023-10-30 02:32:11 26 4
gpt4 key购买 nike

如果这个问题放错地方或重复,我提前道歉。

这个问题本质上类似于doubly Linked list iterator python .

但是,与引用的问题不同,我不希望创建一个包含大量元数据并提供迭代器的总体链表对象(我的应用程序不需要它们)。

我的问题是:是否有任何根本原因导致我不应该或不能提供一个迭代器,该迭代器不迭代它包含的元素,而是跳过通过引用相互链接的不同元素对象?

迭代器对于代码的正常运行不是必需的,但我更喜欢 for item in 结构的语法糖。

我的实现看起来有点像这样(简化版):

class LinkedAccount:
def __init__(self, someParameter, nextAccount = None, prevAccount = None):

self.someParameter = someParameter

self.next = nextAccount
self.prev = prevAccount
if nextAccount is not None:
self._tell_next()
if prevAccount is not None:
self._tell_prev()

def _tell_next(self):
if self.next is not None:
self.next._recv_next(self)

def _recv_next(self,prevAccount):
self.prev = prevAccount

def _tell_prev(self):
if self.prev is not None:
self.prev._recv_prev(self)

def _recv_prev(self,nextAccount):
self.next = nextAccount


def __iter__(self):
return AccountIterator(self)

class AccountIterator:
def __init__(self,Account):
self.Account = Account

def __iter__(self):
return self

def next(self):
if self.Account is None:
raise StopIteration
else:
curAccount = self.Account
self.Account = self.Account.next
return curAccount

LinkedAccount 对象提供一个迭代器,使用已存储在 LinkedAccount 对象中的 .next 参数从一个 LinkedAccount 迭代到下一个。

这种方法似乎可行,但 python 迭代器文档似乎假定迭代器将遍历父对象包含的元素。是否有任何陷阱阻止我做这样的事情?

谢谢!

最佳答案

听起来好像可行,但由于您提到的确切原因,它在语义上很奇怪。在 LinkedAccount 上定义 __iter__ 听起来像是在遍历帐户本身而不是帐户列表。您现在所拥有的看起来就像您正在设置这样的代码行:

for list_item in head_of_list:

这毫无意义。在这种情况下,我认为您可以def 一个简单的生成器:

 def iterate_from(list_item):
while list_item is not None:
yield list_item
list_item = list_item.next

它允许您编写如下代码:

for list_item in iterate_from(head_of_list):

关于链表元素上的 Python 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19721334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com