Python Удалить элемент из списка

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

Мне нужно удалить элементы из списка (они будут содержать определенную фразу), а googled и попробовал несколько способов, но он, похоже, не работает.

То, что у меня есть,

def get_and_count_card_files(date):
    # Retrieve the DC and SD card files
    dc_files = dc_card_files.get_dc_files(dc_start_location, date)
    sd_files = sd_card_files.get_sd_files(sd_start_location)
    print(dc_files)

if '*NoCover*' in dc_files:
    dc_files.remove('*NoCover*')

Dc_files - список (группа имен файлов), и мне нужно удалить все, что имеет NoCover в имени файла. Он существует, поскольку функция печати показывает мне, что он делает.

Кто-нибудь знает, что я делаю неправильно

введите описание изображения здесь

+5
21 сент. '15 в 10:20
источник поделиться
4 ответа

С помощью этого фрагмента кода * не будет делать глобус или регулярное выражение в этих контекстах:

if '*NoCover*' in dc_files:
    dc_files.remove('*NoCover*')

поэтому было бы лучше сказать:

if 'NoCover' in dc_files:

Однако нам нужно найти нужную запись для удаления в списке без использования подстановочных знаков.

Для небольшого списка вы можете перебирать его. Понимание списка сделало бы:

new_dc_files = [dc for dc in dc_files if 'NoCover' not in dc]

Это компактный способ сказать:

new_dc_files = list()
for dc in dc_files:
    if 'NoCover' in dc:
         continue
    new_dc_files.append(dc)
+6
21 сент. '15 в 10:25
источник

Вы ищете Python понимание списка:

dc_files = [el for el in dc_files if 'NoCover' not in el]

Так что это в основном делает, это фильтр всех элементов из dc_files, которые не содержат строку 'NoCover'.

Обратите внимание, что if 'NoCover' not in el выполняется для каждого элемента списка, а оператор in для строки просто проверяет, что именно вы хотели сделать, т.е. является ли 'NoCover' подстрокой el.

0
21 сент. '15 в 10:43
источник

if '*NoCover*' in dc_files: будет искать элемент в списке dc_files, который явно соответствует "NoCover".

Что вы можете сделать, это

# Iterate over the list backwards, this will stop you from skipping elements
# you want to check in the next iteration if you remove something
for index, dc_file in enumerate(dc_files[::-1]):
    if 'NoCover' in dc_file:
        dc_files.pop(index)

В качестве альтернативы вы можете использовать регулярные выражения, если у вас более сложные требования к сопоставлению шаблонов.

0
21 сент. '15 в 10:25
источник

Вы можете использовать понимание списка Python для фильтрации нежелательных записей:

def get_and_count_card_files(date):
    # Retrieve the DC and SD card files
    dc_files = dc_card_files.get_dc_files(dc_start_location, date)
    sd_files = sd_card_files.get_sd_files(sd_start_location)

    print(dc_files)
    dc_files = [file for file in dc_files if 'NoCover' not in file]
0
21 сент. '15 в 10:40
источник

Посмотрите другие вопросы по метке или Задайте вопрос