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

+0

@wnnmaw Вы правильно, отредактированы. –

+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

Это ужасная идея использовать строковые операции, а не встроенную функцию пути. Этот подход с жестким кодированием во многих случаях будет терпеть неудачу. –

Смежные вопросы