Отфильтровать элементы из списка, если они соответствуют одному из нескольких шаблонов

Я нашел решения на разных языках, но не на Python. Имея ограниченный опыт кодирования, кроме Python и R, я не могу их правильно перевести.

У меня есть список таких файлов:

file_list1 = ['/home/qrs/sample1.csv',
 '/home/abc/sample1.csv',
 '/home/mno/sample13.csv',
 '/home/xyz/sample2.csv']

У меня также есть список папок, например:

change_folder = ['mno', 'xyz']

Теперь я хочу отфильтровать список файлов, в котором папки не совпадают с папками в списке папок. Предполагаемый результат будет следующим:

file_list2 = ['/home/qrs/sample1.csv',
 '/home/abc/sample1.csv']

Я пытался:

file_list2 = [x for x in file_list1 if change_folder not in x]

Это работает, только если у меня есть только один шаблон, а не несколько шаблонов. Пожалуйста помоги.

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

Отвечает ли это на ваш вопрос? Проверьте, существует ли несколько строк в другой строке Вы просто хотите сделать это для каждого x в file_list1 и проверить свое условие для каждого y в change_folder

Pranav Hosangadi 11.11.2022 07:53

@PranavHosangadi это очень помогает понять функцию. Странно, как это не появилось при поиске...

Arani 11.11.2022 08:32
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
0
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я настоятельно рекомендую использовать API Path.parts, чтобы проверить, является ли папка частью пути. Также вы можете использовать any с выражением генератора, чтобы проверить условие на несколько шаблонов.

>>> from pathlib import Path
>>> 
>>> 
>>> file_list1 = [
...     "/home/qrs/sample1.csv",
...     "/home/abc/sample1.csv",
...     "/home/mno/sample13.csv",
...     "/home/xyz/sample2.csv",
... ]
>>> 
>>> change_folder = ["mno", "xyz"]
>>> 
>>> r = [
...     path
...     for path in file_list1
...     if not any(folder in Path(path).parts for folder in change_folder)
... ]
>>> print(r)
['/home/qrs/sample1.csv', '/home/abc/sample1.csv']

Работает отлично. Также принял ваше предложение использовать Path.parts. Гораздо элегантнее. Спасибо

Arani 11.11.2022 08:30

Без библиотек или чего-то еще, просто используя базовые функции, я придумал это:

file_list1 = ['/home/qrs/sample1.csv', '/home/abc/sample1.csv', '/home/mno/sample13.csv', '/home/xyz/sample2.csv']
change_folder = ['mno', 'xyz']
output_list = file_list1.copy()

for i in range(len(file_list1)):  # loop through paths
    for folder in change_folder: # loop through folders
        if folder in file_list1[i]: # checks if the folder string is inside the path string
            output_list.pop(output_list.index(file_list1[i])) # pops the path out of the output list
print(output_list)

Вывод:

['/home/qrs/sample1.csv', '/home/abc/sample1.csv']
output_list — это тот же список, что и file_list1, и это запах кода, поскольку вы удаляете из списка, который перебираете. Может быть, вы имели в виду .copy() список, чтобы два объекта были идентичными, но независимыми?
Pranav Hosangadi 11.11.2022 09:03

Джеп, ты прав. Моя ошибка, Код отредактирован.

LiiVion 11.11.2022 10:05

Другие вопросы по теме