3

文字列を含むPythonのリストがあります:

["foo/bar","foo/bar/baz","foo/bar/qux"]

他の長い要素に含まれていない、そのリスト内の最小の要素を分離しようとしています。["foo/bar/baz","foo/bar/qux"]この場合、リストはもはや要素に含まれていないため、リストを返したいと考えています。"foo/bar"とに含まれているため、 は"foo/bar/baz"必要ありません"foo/bar/qux"。ここでforステートメントとifステートメントをネストしようとしましたが、うまくいかないようです。誰かが私を正しい方向に向けることができますか?

4

5 に答える 5

2

あなたが本当にリーフディレクトリを探していると仮定すると (つまり、「含まれる」は実際には「接頭辞」を意味し、スラッシュ特別です)、単純なアルゴリズムは次のとおりです。

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

これにより、最後のコンポーネントが取り除かれ、親が入ります。(ここでは意図的に空の文字列を入力しました。その方が少し簡単です。)

于 2013-07-01T22:57:44.997 に答える