Удаление строки из списка, если строка содержит указанный символ

1

Следуя:

list1 = ['something',"somet'hing",'somet"hing','some;thing','']
list2 = [';','"',"'"]

Я хотел бы получить отфильтрованный список1, если строка внутри списка содержит любой символ из списка2 или строка пуста. Желаемый результат:

list3 = ['something']

В настоящее время я делаю это вручную следующим образом:

list1withoutEmptyLines= list(filter(None, list1))
list1withoutQuote = [x for x in list1withoutEmptyLines if "'" not in x]
list1withoutDoublequotes = [x for x in list1withoutQuote if "\"" not in x]
list1withoutSemicolon = [x for x in list1withoutDoublequotes if ";" not in x]

и он отлично работает. Я также попытался автоматизировать его, создав список запрещенных символов:

forbiddenCharacters = ['"', ';', '\'']
filteredLines = []

for character in forbiddenCharacters:
    filteredLines = [x for x in uniqueLinesInFile if character not in x]

но список с именем filterLines по-прежнему содержит строки с точкой с запятой ";". Любые советы будут оценены.

  • 0
    [x for x in list1 if not any(y in x for y in list2)]
  • 0
    Вы перезаписываете filteredLines в каждой итерации.
Теги:
list

1 ответ

3
Лучший ответ

Вы можете сделать это, используя понимание списка в сочетании со встроенной функцией any:

list1 = ['something', "somet'hing", 'somet"hing', 'some;thing', '']
list2 = [';', '"', "'"]

result = [s for s in list1 if s and not any(c in s for c in list2)]
print(result)

Выход

['something']

Понимание списка эквивалентно:

result = []
for s in list1:
    if s and not any(c in s for c in list2):
        result.append(s)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню