私はリンク式のリストのような階層構造をトラバースする方法をリスト式を使って考えようとしてきましたが、うまくいくようなことは考えていません。リストの理解を使用してリンクされたリストをどのように歩くのですか?
基本的に、私はこのコードを変換したい:のようなワンライナーに
p = self.parent
names = []
while p:
names.append(p.name)
p = p.parent
print ".".join(names)
を:
print ".".join([o.name for o in <???>])
私も、???
一部でトラバーサルを行う方法がわからないんだけど、一般的な方法で(その可能性がある場合)。私は同様のタイプの属性を持ついくつかの構造体を持っており、それぞれに対して降伏関数を書いているとは思わない。
編集:その既にオブジェクト自体の中に含まれる値を反復するために使用されるため
Iは、オブジェクト自体の__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)
はい!これは私が探していたものです。私は私の適応で私の答えを更新しました。 –
'fixedpoint'は[David Xの' cfor'](http://stackoverflow.com/questions/2740901/simulating-c-style-for-loops-in-python/2741943#2741943)のように書くことができます'def fixedpoint(f、start、stop):リターンcfor(開始、ラムダ現在:現在の!=停止、f)' –