0

次のようなフォルダーのリストがあります。

u'Magazines/testfolder1',
u'Magazines/testfolder1/folder1/folder2/folder3',
u'Magazines/testfolder1/folder1/',
u'Magazines/testfolder1/folder1/folder2/',
u'Magazines/testfolder2',
u'Magazines/testfolder2/folder1/folder2/folder3',
u'Magazines/testfolder2/folder1/',
u'Magazines/testfolder2/folder1/folder2/',
u'Magazines/testfolder3',
u'Magazines/testfolder3/folder1/folder2/folder3',
u'Magazines/testfolder3/folder1/',
u'Magazines/testfolder3/folder1/folder2/',

今私が欲しいのは、親フォルダーのみのリストです。

つまり、上記の例では、次のように削減したいと考えています。

u'Magazines/testfolder1',
u'Magazines/testfolder2',
u'Magazines/testfolder3',

すべてに子フォルダーが含まれているためです。

私のデータベースにフォルダーを再帰的に追加しているのでtestfolder1、スクリプトはそのサブフォルダーを自動的に再帰します。そのため、親もリストに含まれている場合、リストにサブフォルダーは必要ありません。

どうやってやるの?

4

4 に答える 4

2

使用セット:

>>> list_of_folders = [
...     u'Magazines/testfolder1',
...     u'Magazines/testfolder1/folder1/folder2/folder3',
...     u'Magazines/testfolder1/folder1/',
...     u'Magazines/testfolder1/folder1/folder2/',
...     u'Magazines/testfolder2',
...     u'Magazines/testfolder2/folder1/folder2/folder3',
...     u'Magazines/testfolder2/folder1/',
...     u'Magazines/testfolder2/folder1/folder2/',
...     u'Magazines/testfolder3',
...     u'Magazines/testfolder3/folder1/folder2/folder3',
...     u'Magazines/testfolder3/folder1/',
...     u'Magazines/testfolder3/folder1/folder2/',
... ]
>>> result = set()
>>> for folder in list_of_folders:
...     for parent in result:
...         if folder.startswith(parent):
...             break
...     else:
...         result.add(folder)
... 
>>> result
{'Magazines/testfolder3', 'Magazines/testfolder2', 'Magazines/testfolder1'}

アップデート

list_of_folders = [
    ...
]
result = set()
for folder in list_of_folders:
    if all(not folder.startswith(parent) for parent in result):
        result.add(folder)
print result
于 2013-07-25T04:23:45.307 に答える
0

私が信じているメイトは、あなたが探しているソリューションです

lst = [
u'Magazines/testfolder1',
u'Magazines/testfolder1/folder1/folder2/folder3',
u'Magazines/testfolder1/folder1/',
u'Magazines/testfolder1/folder1/folder2/',
u'Magazines/testfolder2',
u'Magazines/testfolder2/folder1/folder2/folder3',
u'Magazines/testfolder2/folder1/',
u'Magazines/testfolder2/folder1/folder2/',
u'Magazines/testfolder3',
u'Magazines/testfolder3/folder1/folder2/folder3',
u'Magazines/testfolder3/folder1/',
u'Magazines/testfolder3/folder1/folder2/'
 ]

    for x in lst:
       for y in lst[:]: 
           if x in y and len(x)<len(y):
               lst.remove(y)
    print lst

出力

[u'Magazines/testfolder1', u'Magazines/testfolder2', u'Magazines/testfolder3']

このプログラムは、リストからサブフォルダーを繰り返し削除し、親フォルダーのみを残します。

于 2013-07-25T22:15:10.730 に答える
0
l =[u'Magazines/testfolder1',
    u'Magazines/testfolder1/folder1/folder2/folder3',
    u'Magazines/testfolder1/folder1/',
    u'Magazines/testfolder1/folder1/folder2/',
    u'Magazines/testfolder2',
    u'Magazines/testfolder2/folder1/folder2/folder3',
    u'Magazines/testfolder2/folder1/',
    u'Magazines/testfolder2/folder1/folder2/',
    u'Magazines/testfolder3',
    u'Magazines/testfolder3/folder1/folder2/folder3',
    u'Magazines/testfolder3/folder1/',
    u'Magazines/testfolder3/folder1/folder2/', ]

mincount = min(s.count('/') for s in l)
[d for d in sorted(l) if d.count('/') <= mincount]
#=> [u'Magazines/testfolder1', u'Magazines/testfolder2', u'Magazines/testfolder3']

それほど賢いわけではありませんが、共通のルートがある場合に機能します。

于 2013-07-26T01:42:07.857 に答える
0

正規表現を使ってみませんか?

import re

l = [
    u'Magazines/testfolder1',
    u'Magazines/testfolder1/folder1/folder2/folder3',
    u'Magazines/testfolder1/folder1/',
    u'Magazines/testfolder1/folder1/folder2/',
    u'Magazines/testfolder2',
    u'Magazines/testfolder2/folder1/folder2/folder3',
    u'Magazines/testfolder2/folder1/',
    u'Magazines/testfolder2/folder1/folder2/',
    u'Magazines/testfolder3',
    u'Magazines/testfolder3/folder1/folder2/folder3',
    u'Magazines/testfolder3/folder1/',
    u'Magazines/testfolder3/folder1/folder2/',
]

expect = [
    u'Magazines/testfolder1',
    u'Magazines/testfolder2',
    u'Magazines/testfolder3', 
]

result = filter(lambda x: re.match('^[^\/]+\/[^\/]+$', x), l)

assert expect == result
于 2013-07-25T07:42:25.543 に答える