Я нашел решения на разных языках, но не на 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]
Это работает, только если у меня есть только один шаблон, а не несколько шаблонов. Пожалуйста помоги.
Обновлено: получил ответ на другой вопрос. Однако полученный здесь ответ также включает элементы, предназначенные специально для фильтрации строк пути, которые будут полезны для будущих посетителей.
@PranavHosangadi это очень помогает понять функцию. Странно, как это не появилось при поиске...
Я настоятельно рекомендую использовать 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. Гораздо элегантнее. Спасибо
Без библиотек или чего-то еще, просто используя базовые функции, я придумал это:
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()
список, чтобы два объекта были идентичными, но независимыми?
Джеп, ты прав. Моя ошибка, Код отредактирован.
Отвечает ли это на ваш вопрос? Проверьте, существует ли несколько строк в другой строке Вы просто хотите сделать это для каждого x в file_list1 и проверить свое условие для каждого y в change_folder