これをどのように説明すればよいかわかりませんが、ここにいる誰かが理解して助けてくれることを願って試してみます. ナビゲーション構造に表示される可能性のあるノードへのパスで構成されるリストがいくつかあります。
['nav1']
['nav1','subnav1']
['nav1','subnav2']
['nav2']
['nav3']
['nav3','subnav1']
['nav3','subnav2']
['nav3','subnav3']
['nav3','subnav3','subsubnav1'] **
['nav3','subnav3','subsubnav1','subsubsubnav']
['nav4']
['nav5']
['nav5','subnav1']
['nav5','subnav1','subsubnav1']
['nav5','subnav2']
['nav5','subnav3']
このナビゲーションで ** で示されるノードを選択したとすると、このノードの親および兄弟であるすべてのノードも返したいと思います。(Windows エクスプローラのツリー メニューと同様)。
したがって、選択した例を使用すると、次のように返されます。
['nav1']
['nav2']
['nav3']
['nav3','subnav1']
['nav3','subnav2']
['nav3','subnav3']
['nav3','subnav3','subsubitem1']
['nav3','subnav3','subsubitem1','subsubsub']
['nav4']
['nav5']
これを最も効率的なpythonicな方法で達成したいと思います。私自身も何度か挑戦しましたが、うまくいきませんでした。これは私が訪れた中で最も近いものですが、残念ながら兄弟は返されません。
#model_path is the current selected node e.g ** as illustrated above
#always show 1st level nodes
if len(node_path) == 1:
return True
#always show final level nodes
if model_path == node_path[:-1]:
return True
#show all items in tree from root to model
if len(node_path) > 1:
return self._find_sublist(node_path, model_path) >= 0
#show siblings at each level traversed
#????
# find_sublist credit to this post by nosklo:
# http://stackoverflow.com/a/2251638/1844977
def _find_sublist(self, sub, bigger):
if not bigger:
return -1
if not sub:
return 0
first, rest = sub[0], sub[1:]
pos = 0
try:
while True:
pos = bigger.index(first, pos) + 1
if not rest or bigger[pos:pos+len(rest)] == rest:
return pos
except ValueError:
return -1
解決策を見つけるのに苦労しているので、ここで助けていただければ幸いです。追加する必要があるのは、無制限の数のレベルがある場合に機能するソリューションです。
この質問が明確でない場合、または重複している場合はお詫び申し上げます (おそらく恐れています) が、私が尋ねていることの正しい用語を本当に知らないという事実は、私の検索に役立ちません.
ちなみに、私は Python 2.4 に制限されています。