如何根据子字符串筛选项目列表



我有一个包含文件路径集合的列表,我想提取只包含'mp4'的路径。

lists = ['/Users/me/1. intro.mp4', 'The mp4 version.vlc'
'/Users/2. intro.vtt', '/Users/1. ppt.rar', '/Users/2. ppt.mp4']

预期输出:

['/Users/me/1. intro.mp4', 'The mp4 version.vlc','/Users/2. ppt.mp4']

我尝试了下面的代码,但它并没有给我正确的输出。我的代码看起来:

lists = ['/Users/me/1. intro.mp4',
'/Users/2. intro.vtt', '/Users/1. ppt.rar', '/Users/2. ppt.mp4']

def Filter(string, substr):
return [str for str in string if
any(sub in str for sub in substr)]

searchString = 'mp4'
result = Filter(lists, searchString)
print(f'{result}')

如果我运行程序,它会给我以下输出:

['/Users/me/1. intro.mp4', '/Users/1. ppt.rar', '/Users/2. ppt.mp4']

有人能告诉我怎么修吗?

您只需要检查substr是否在列表中的每个项目中。

def Filter(string, substr):
return [item for item in string if substr in item]

您的代码,即

any(sub in str for sub in substr)

检查字母"m"、"p"或"4"中是否有任何一个在str中,因为您有一个嵌套的理解,它迭代substr本身中的每个字符。

我也不会像您所做的那样使用"str"作为变量名,因为它用于内置的str类。

试试这个:

lists = ['/Users/me/1. intro.mp4',
'/Users/2. intro.vtt', '/Users/1. ppt.rar', '/Users/2. ppt.mp4']
def filterSubstr(lists, substr):
return [x for x in lists if substr in x]
searchString = 'mp4'
print(filterSubstr(lists, searchString))

结果:

['/Users/me/1. intro.mp4', '/Users/2. ppt.mp4']

我建议使用pathlib模块,它可以很容易地实际检查文件的扩展名——这是一个比仅仅检查一个字符串是否是另一个字符串的子字符串更严格的测试:

from pathlib import Path

file_paths = ['/Users/me/1. intro.mp4', '/Users/2. intro.vtt', '/Users/1. ppt.rar',
'/Users/2. ppt.mp4']
def filter_on_extension(paths, ext):
return [path for path in paths if Path(path).suffix == ext]
file_extension = '.mp4'
result = filter_on_extension(file_paths, file_extension)
print(result)  # -> ['/Users/me/1. intro.mp4', '/Users/2. ppt.mp4']

最新更新