2014-04-14 69 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

使用字符串操作而不是內置路徑功能是一個可怕的想法。這種硬編碼方法在很多情況下都會失敗。 –

相關問題