我有一个已排序的目录列表:
lst :=
./C01
./C01/BOOST
./C01/BOOST/src
./C01/BOOST/src/template
./C01/EmployeeAdmin
./Spheres
./db01/src/scottlib # added later
./db03
./db03/src
./db03/src/examples
./db03/src/exercises
./txt2bmp
./txt2bmp/data
./txt2bmp/docs
./txt2bmp/tests
./txt2bmp/txt2bmp
./txt2bmp_COPYED
./txt2bmp_COPYED/data
./txt2bmp_COPYED/docs
./txt2bmp_COPYED/tests
./txt2bmp_COPYED/txt2bmp
./txt2bmp_cpp
./txt2bmp_cpp/doc
我试图删除所有子文件夹 - 如果存在 - ,但我无法以一种漂亮的pythonic方式执行此操作。我用循环做了,但这是一个漫长,丑陋且难以理解的解决方案...... 删除后,列表应如下所示:
lst2 :=
./C01
./Spheres
./db01/src/scottlib
./db03
./txt2bmp
./txt2bmp_COPYED
./txt2bmp_cpp
下一行是我试图以多种方式修改的命令,但没有成功......
[ i for i in lst if not i.startswith(lst[0])]
也许你有想法以优雅的方式解决这个问题?
答案 0 :(得分:0)
在您的情况下,您可以对路径分隔符进行简单计数,并将其用于在列表理解中进行过滤,仅保留计数为1的项目:
lst2 = [i for i in lst if i.count('/')==1]
考虑到@ Jean-FrançoisFabre的评论,您可以将/
替换为os.sep
,以便为代码段添加一些可移植性。
答案 1 :(得分:0)
我认为这可以解决问题
lst2 = [a for a in lst if '/'.join(a.split('/')[:-1]) not in lst]
for line in lst2: print line
输出:
./C01
./Spheres
./db03
./txt2bmp
./txt2bmp_COPYED
./txt2bmp_cpp
答案 2 :(得分:0)
我首先将路径规范化(使用os.path.relpath
),然后隔离第一个组件,然后过滤到唯一路径(使用set
):
from os.path import relpath
def strip_tail(path):
try:
return path[:path.index("/")]
except ValueError:
return path
lst2 = list(set(strip_tail(relpath(dir)) for dir in lst))