我一直在想一種方法來使用列表表達式遍歷層次結構,如鏈接列表,但還沒有提出任何看起來工作的東西。如何使用列表理解走出鏈表?
基本上,我想這個代碼轉換:
p = self.parent
names = []
while p:
names.append(p.name)
p = p.parent
print ".".join(names)
成一個班輪,如:
print ".".join([o.name for o in <???>])
我不知道該怎麼辦遍歷在???
一部分,雖然,以通用方式(如果它甚至可能的話)。我有幾個具有類似.parent
類型屬性的結構,並且不希望爲每個結構都寫入yielding函數。
編輯:
我不能使用對象本身的__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)
是的!這是我正在尋找的東西。我用我的改編版更新了我的答案。 – 2009-06-20 00:56:49