2016-08-16 2 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)) 

Im знать, я не должен быть изменения размера списка через петлю, но я оставил его только приблизительно дают представление о том, что я пытаюсь выполнить

Я не делал это ясно, проблема, с которой сталкивается я, заключается в том, что я не уверен, какой подход я должен принимать при попытке удалить каждый элемент, который не содержит «.py». То, что я написал выше, является более приблизительным.

+1

какие проблемы вы столкнулись ... –

+2

вы можете создать новый список, основанный на старых один: файлов '= [F для F в someFiles если» .py "не в 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

Первый из всего, вам не нужно использовать для цикла, чтобы перебирать список в Python. Simpler версия о том, что вы сделали бы

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

но фильтрации списка (или в более общем смысле, итераторы) настолько часто, что есть Python встроенная функция называется, что не удивительно, filter:

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

(это будет работать, по крайней мере в Python3)

+0

Да, я не знаю, почему я пытался удалить, это работает отлично. спасибо – RayBae