我是Python / AnyTree的新手,正在尝试获取制作汉堡包(旧金山附近Point San Pablo Harbor的汉堡包)的原料清单,如果您在该地区!!实际上,下一次您到城里时,这里的获胜答案将免费为我提供汉堡包!)但是我离题了……
问题是如何获取树中的“ qty”和“ uom”字段?
from anytree import Node, RenderTree, PreOrderIter
Harburger=Node("Harburger", children=[
Node("RoundRoll", qty=1, uom='ea'),
Node("GriddleGhee", qty = 1, uom='gm'),
Node("SmashedBurger", qty = 5, uom='oz')])
print(RenderTree(Harburger))
Node('/Harburger')
├── Node('/Harburger/RoundRoll', qty=1, uom='ea')
├── Node('/Harburger/GriddleGhee', qty=1, uom='gm')
└── Node('/Harburger/SmashedBurger', qty=5, uom='oz')
到目前为止,太好了。 现在我可以遍历这棵树了,
#print ingredients for 5 Harburgers
print([(node.name for node in PreOrderIter(Harburger)])
['Harburger', 'RoundRoll', 'GriddleGhee', 'SmashedBurger']
如何修改此命令以获取数量和uom?
我尝试过
print([(node.name, node.qty) for node in PreOrderIter(Harburger)])
只能得到错误!
答案 0 :(得分:0)
您的代码访问额外属性的问题是,顶级Node
不具有qty
和uom
属性,因此当它出现在pre遍历树时,代码会异常退出。
您可以通过几种方式解决此问题。您评论过的一种方法是,也将属性添加到根节点。
另一种选择可能是在使用属性之前测试它们,例如:
print([(node.name, node.qty) for node in PreOrderIter(Harburger) if hasattr(node, "qty")])
如果您仅依赖具有两个级别的树(顶级根节点及其子级),则可以仅遍历子级节点,而不必进行完整遍历。只需使用Harburger.children
而不是PreOrderIter(Harburger)
。