我一直在尝试寻找一种使用列表表达式来遍历链表等层次结构的方法,但还没有想出任何似乎可行的方法。
基本上,我想转换这段代码:
p = self.parent
names = []
while p:
names.append(p.name)
p = p.parent
print ".".join(names)
像这样的一行:
print ".".join( [o.name for o in <???>] )
不过,我不确定如何在 ??? 部分进行遍历,以通用方式(如果可能的话)。我有几个具有类似 .parent 类型属性的结构,并且不想为每个结构编写一个生成函数。
编辑:
我不能使用对象本身的 __iter__ 方法,因为它已经用于迭代包含在对象本身中的值。大多数其他答案,除了 liori 的答案,都对属性名称进行硬编码,这是我想避免的。
这是我根据 liori 的回答改编的:
import operator
def walk(attr, start):
if callable(attr):
getter = attr
else:
getter = operator.attrgetter(attr)
o = getter(start)
while o:
yield o
o = getter(o)
请您参考如下方法:
我能想到的最接近的事情是创建一个父生成器:
# Generate a node's parents, heading towards ancestors
def gen_parents(node):
node = node.parent
while node:
yield node
node = node.parent
# Now you can do this
parents = [x.name for x in gen_parents(node)]
print '.'.join(parents)
