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] 

split() 함수를 사용하여 결과를 얻고 있지만 경로에서 라이브러리 이름을 버리려고합니다.

어떤 도움을 주시면 감사하겠습니다.

답변

1

당신은 (이 심하게 종료 될거에요 시도하고 경로를 문자열 작업을하지 않는다) 원하는 것 : 그것의 경로에서 디렉토리 이름을 가져옵니다으로

import os 

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

os.path.dirname 경로를 분할합니다. 공백을 기반으로 listtext, split의 모든 항목에 대해이 작업을 수행합니다. 이 작업은 시리즈의 모든 항목에 대해 수행됩니다. 중복을 제거하려면 set으로 변환 한 다음 마지막으로 list으로 변환하면됩니다. 당신은, 편집 올바른지 @wnnmaw

+1

와 시도는'''os.path.dirname()''' – 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

기본 제공 경로 기능보다는 문자열 연산을 사용하는 것은 끔찍한 생각입니다. 이 하드 코딩 방식은 많은 경우 실패합니다. –

관련 문제