2016-08-16 1 views
0

이와 비슷한 질문이 있지만 찾고자하는 것이 없습니다.Python은 알 수없는 목록에서 특정 문자열로 요소를 제거합니다.

특정 경로의 모든 파일이있는 목록을 만들어서 문자열에 특정 시퀀스가 ​​포함되지 않은 것을 필터링하려고합니다.

def filter(): 
    someFiles = os.listdir(somePath) 
    listSize = len(someFiles) 

    for i in range(0, listSize): 
     if (".py" not in someFiles): 
      someFiles.remove(i) 
      print("{0}".format(someFiles)) 

임 대략 나는 그것을하지 않았다

달성하기 위해 노력하고있어의 아이디어를 줄 내가 루프를 통해 목록의 크기를 수정해서는 안하지만 난 그냥 그것을 왼쪽 인식 분명히 직면하는 문제는 ".py"가 포함되지 않은 모든 요소를 ​​제거하려고 할 때 어떤 접근 방식을 사용해야하는지 잘 모르겠다는 것입니다. 내가 위에서 쓴 것은 더 근본적인 초안이다.

+1

당신은 당신은 하나의 오래 된 기반으로 새 목록을 만들 수 있습니다 ... –

+2

에 직면 한 일 문제 (이 적어도 Python3에서 일 것이다) : someFiles에서 F 만약 "평에 대한 F '파일 = [ "f에 없다" – pschill

+1

@pschill이 접근법을 사용하려면'if ".py"in f "가 필요합니다 (OP **는 ** 안에'.py '가없는 파일들을 제거합니다). – DeepSpace

답변

3
for i in range(0, listSize): 
    if (".py" not in someFiles): 
     someFiles.remove(i) 

목록에서 i을 제거하려고합니다. i은 목록의 요소 색인 (0, 1 등)이며 실제 요소는 아닙니다. 이렇게하면 오류가 발생합니다.


만하면 필요 할 파일 만 가져 지능형리스트를 사용

required_files = [f for f in someFiles if '.py' in f] 

또한 filter 사용할 수를하지만 람다 필요합니다 (그리고 또한이 반환됩니다주의 filter 객체가 아닌 list) :

required_files = list(filter(lambda x: '.py' in x, someFiles)) 
+0

맞아, 내 논리가 꺼져 있었어. 내가하려고 한 것이지. 고마워요 – RayBae

1

우선 무엇보다, for 루프를 사용하여 파이썬에서리스트를 반복 할 필요가 없다. 당신이 무슨 짓을했는지의 간단한 버전은

list2 = [] 
for filename in list1: 
    if (".py" in filename): 
     list2.append(filename) 

하지만 목록을 필터링하는 것 (또는 더 일반적으로, 반복자는) 당연히,라고 파이썬 내장 함수, filter 있다는 것을, 그래서 일반적이다 :

list2 = list(filter(lambda i: ".py" in i, list1)) 

+0

그래, 왜 내가 제거하려고했는지 모르겠어,이 완벽하게 작동합니다. 고맙습니다 – RayBae

관련 문제