2015-07-14 3 views
0
fileList = ['a.txt', 'b.pdf','c.exe','d.pdf','e.mp3'] 
extension = '.pdf' 

for i in fileList: 
    if extension in i: 
     print i 
>>> 
b.pdf 
d.pdf 
>>> 

Скрипт выводит список, я хочу ... НО как я получаю сценарий, чтобы изменить fileList следующим образом:Как удалить строки из списка навсегда?

fileList = ['b.pdf', 'd.pdf'] ???

Я пытался ...

for i in fileList: 
    if extension not in i: 

следуют ...

del i, fileList.pop, fileList.remove, etc 

НО fileList не постоянно меняется.

ответ

1

Вам необходимо попробовать истиратор над копией fileList И удалить из fileList. Пример -

>>> fileList = ['a.txt', 'b.pdf','c.exe','d.pdf','e.mp3'] 
>>> extension = '.pdf' 
>>> 
>>> for i in fileList[:]: 
...  if not i.endswith(extension): 
...    fileList.remove(i) 
... 
>>> fileList 
['b.pdf', 'd.pdf'] 

Но вы на самом деле не нужно, вы можете использовать простой список понимание, чтобы просто сделать имя fileList точку к которой файлы без расширения не существует. Alos, вы можете использовать string.endswith, чтобы проверить, заканчивается ли строка со значением.

Пример -

>>> fileList = ['a.txt', 'b.pdf','c.exe','d.pdf','e.mp3'] 
>>> extension = '.pdf' 
>>> fileList = [i for i in fileList if i.endswith(extension)] 
>>> fileList 
['b.pdf', 'd.pdf'] 
+0

Он потерпит неудачу в тех случаях, когда имя name.pdf.jpg –

+0

Спасибо, изменил его, чтобы использовать 'endswith'. –

1

Попробуйте

del list[index] 
#example :- 
del list[1] 
3

Некоторые операции список не очень эффективны. insert и remove из случайных местоположений - это пара, которая является O (n).

Извлечение элементов из списка, который вы выполняете с помощью цикла for, также является хорошим способом введения ошибок, поскольку предметы, следующие сразу после удаленных, будут пропущены.

Оказывается, это, как правило, гораздо более эффективным, чтобы создать новый список фильтрации Нежелательные пункты

file_list = ['a.txt', 'b.pdf','c.exe','d.pdf','e.mp3'] 
extension = '.pdf' 

new_list = [x for x in file_list if x.endswith(extension)] 

Обратите внимание, что я изменил логику, чтобы использовать endswith для предотвращения случайного совпадения в пути имени файла

0

Вы также можете сделать это с помощью встроенной функции filter, таким образом:

fileList = filter(lambda s:s.endswith(extension), fileList) 
+1

Учет списка обычно быстрее, чем 'filter'. Также 'filter' не возвращает список в Python3. На самом деле это не вверх, поэтому он обычно не используется, поскольку Python1 –

+0

@ JohnLaRooy..thanks для обратной связи ...:) ... это то же самое для модуля 'itertools', который имеет' ifilter() ' ? –

+0

'filter' в Python3 ведет себя как' ifilter' в itertools. Легче использовать представления списков и выражения генераторов, поскольку им не требуется переносить перенос между Python2 и Python3 –

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