2014-04-14 65 views
0

我想删除列表中的最后一个字符串,即库名称(用'\'分隔)。我拥有的文本字符串包含编译时使用的库的路径。这些库由空格分隔。我希望保留每个路径,但不要直到库名称,只有一个根目录。从列表中排除最后一个分隔的项目

例子:

text = " /opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4/crtbeginT.o /opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4/crtfastmath.o /opt/cray/cce/8.2.5/craylibs/x86-64/no_mmap.o /opt/cray/cce/8.2.5/craylibs/x86-64/libcraymath.a /opt/cray/cce/8.2.5/craylibs/x86-64/libcraymp.a /opt/cray/atp/1.7.1/lib/libAtpSigHandler.a /opt/cray/atp/1.7.1/lib/libAtpSigHCommData.a " 

我希望我的输出要像 -

Output_list = 
[/opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4, 
/opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4, 
/opt/cray/cce/8.2.5/craylibs/x86-64, 
/opt/cray/cce/8.2.5/craylibs/x86-64, 
/opt/cray/cce/8.2.5/craylibs/x86-64, 
/opt/cray/atp/1.7.1/lib, 
/opt/cray/atp/1.7.1/lib] 

,最后我想删除重复的output_list因此这个列表的样子。

New_output_list = 
[/opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4, 
/opt/cray/cce/8.2.5/craylibs/x86-64, 
/opt/cray/atp/1.7.1/lib] 

我使用分裂()函数得到的结果,但我很努力,丢弃路径库名。

任何帮助,将不胜感激。

回答

1

你似乎想(不要尝试做字符串操作与路径,它必将结束严重):

import os 

New_output_List = list(set(os.path.dirname(pt) for pt in text.split())) 

os.path.dirname分割的路径到它是从一个路径得到的目录名。我们为text,split中的每个项目执行基于空格的list。这是为系列中的每个项目完成的。 要删除重复项,我们只将它转换为set,最后转换为list

+1

我想'''os.path.dirname()'''@wnnmaw你是正确的,编辑是一点点简单的 – wnnmaw

+0

。 –

+0

实际上,我正在读取数据库的路径,而不是在运行时获取它。所以我只有文本字符串可以工作。 – kay

0

尝试用这种

text = " /opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4/crtbeginT.o /opt/gcc/4.4.4/snos/lib/gcc/x86_64-suse-linux/4.4.4/crtfastmath.o /opt/cray/cce/8.2.5/craylibs/x86-64/no_mmap.o /opt/cray/cce/8.2.5/craylibs/x86-64/libcraymath.a /opt/cray/cce/8.2.5/craylibs/x86-64/libcraymp.a /opt/cray/atp/1.7.1/lib/libAtpSigHandler.a /opt/cray/atp/1.7.1/lib/libAtpSigHCommData.a " 
    New_output_List = [] 
    for x in list(set(text.split(' '))): 
     New_output_list.append("".join("/" + y if y else '' for y in x.split("/")[:-1])) 
+0

使用字符串操作而不是内置路径功能是一个可怕的想法。这种硬编码方法在很多情况下都会失败。 –

相关问题