あなたが本当にリーフディレクトリを探していると仮定すると (つまり、「含まれる」は実際には「接頭辞」を意味し、スラッシュは特別です)、単純なアルゴリズムは次のとおりです。
def leaf_dirs(dirlist):
"""Given a list of directories, find leaf directories"""
parents = {}
for path in dirlist:
parts = path.split('/')
if parts[0] == '':
raise ValueError("can't handle rooted directory %s" % path)
parent = '/'.join(parts[:-1])
parents[parent] = True
return [path for path in dirlist if path not in parents]
基本的に、すべての「親ディレクトリ」名は辞書に入れられ、それらの名前はフィルターで除外されます。「foo/bar/baz」と「foo/bar/quux」の場合、親パス(foo/bar)が2回入りますが、あまり気にしません。
編集: を使用する代わりに、Omri Barel が指摘した点を修正するにはparts[:-1]
:
while parts:
parts.pop() # strip last path component
parent = '/'.join(parts)
parents[parent] = True
これにより、最後のコンポーネントが取り除かれ、親が入ります。(ここでは意図的に空の文字列を入力しました。その方が少し簡単です。)