删除多个列表元素(子字符串)

时间:2017-02-28 17:06:13

标签: python list

我有一个已排序的目录列表:

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])]

也许你有想法以优雅的方式解决这个问题?

3 个答案:

答案 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))