如何在 python 生成器表达式中包含多个搜索字符串?

How to include multiple search strings in python generator expression?

我有一个文件列表--前两个文件名相同,但目录路径不同。目录路径中还包含状态代码(例如 CA 或 OK)。

files = [r'C:\temp\OK\somefile_1234_nw.tif',
         r'C:\temp\test\CA\somefile_1234_nw.tif',
         r'C:\temp\OK\somefile_9999_nw.tif']

我可以使用以下生成器表达式提取具有特定文件名的第一个文件:

search_string = 'somefile_1234_nw.tif'
print next((s for s in files if search_string in s), None)

如何使用生成器表达式提取包含两个搜索字符串('CA' 和 'somefile_1234_nw.tif')中的项目的文件?在这种情况下,处理效率很重要,因为我的放大问题有数千个项目。

预期输出是:

'C:\temp\test\CA\somefile_1234_nw.tif'

你的意思是这样的吗?

>>> next((s for s in files if all(i in s for i in['somefile_1234_nw.tif', 'CA'])), None)
'C:\temp\test\CA\somefile_1234_nw.tif'

all() 检查迭代器中的所有元素是否都是 True,如果是,return True,否则,return False.

像这样的东西应该可以工作:

search_strings = ['somefile_1234_nw.tif', 'CA']
print next((s for s in files if all([search_string in s for search_string in search_strings])), None)

由于您正在寻找速度,因此发电机可能不是最佳选择。生成器非常有用有几个原因,比如当你要 运行 内存不足时,或者当你在得到下一个答案之前有额外的处理要做时。

为了加快处理 1000 项甚至数百万项的速度:您需要使用 pandas 系列。 (因为 1000 项将适合您机器的内存。)

import pandas as pd
files = pd.Series([r'C:\temp\OK\somefile_1234_nw.tif',
         r'C:\temp\test\CA\somefile_1234_nw.tif',
         r'C:\temp\OK\somefile_9999_nw.tif'])

pattern2 = 'CA'
pattern1 = 'somefile_1234_nw.tif'

mask1 = files.str.contains(pattern1)
files2 = files[mask1]
mask2 = files2.str.contains(pattern2)
files2[mask2].values

我想听听您的数据的时间安排。