下面是对我的一个树行走算法问题的回答
MLM downline distribution count
我想遍历整个用户树并打印节点,但收到一条奇怪的错误消息:
TypeError: 'User' object is not iterable
这是我在树上行走时尝试运行的代码:
downlinestack = []
distributor=self
downlinestack += User.query(User.sponsor == distributor.key).fetch(99999999)
while downlinestack:
downline = downlinestack.pop()
logging.info('downline: %s' %str(downline))
for person in downline:
downlinestack.append(User.query(User.sponsor == person.key).fetch(99999999))
logging.info('person: %s' %str(person.key.id()))
我应该如何更改代码,使其遍历通过发起人属性连接的用户树?在
谢谢你
我找到了一个递归的解决方案,如下所示:
^{pr2}$
线
期望RHS返回一个扩展
^{pr2}$downlinestack
的列表。在除非用户.查询().fetch()返回一个列表,我怀疑您的意思是
我的另一个猜测是,无论您在
downlinestack
中附加的内容都是不可编辑的,因此下面的行失败了让我通过逐行检查代码来澄清:
首先,您没有告诉我们
^{pr2}$User.query
返回什么。我假设这是一个用户对象列表。所以现在downlinestack
看起来是这样的:[User1, User2, User3]
现在,
downline
包含从堆栈末尾弹出的单个用户,User3
。在这是您的错误:
User3
不可编辑。这并不神秘:它不是那种物体。它不是一个可以依次迭代访问的项的集合。如果你想在这里迭代一些东西,你必须自己生成iterable。在有两种可能的方法。第一种方法是迭代用户.查询公司名称:
您的另一个选择是将
downlinestack
放入列表列表中:这两种方法都可以。在
我没有足够的上下文来测试上面的内容,但是我创建了自己的简化测试方案,只是为了说明这确实有效。在
如您所见,这将打印出查询树中每个人的id(除了根id 0)。在
另一种方法是:
为什么不只用两个嵌套的for?在
相关问题 更多 >
编程相关推荐