我有1个带有文件名的列表和1个带有过滤词的嵌套列表。筛选器列表具有3个列表,每个列表具有不同的子列表长度。
如何迭代列表并使用该and函数?它需要检查列表因为差的所有值['employer', 'finance']和['employer', 'adress']。
filter = [
['employer','finance'],
['manifest'],
['epmloyer','adress','home']
]
file_list = [
'01012017_employer_finance.txt',
'25102017_cargo_manifest.txt',
'12022018_epmloyer_home_adress.txt',
]
"""search for financial file"""
if filter0 in file_list[0] and filter0 in file_list[0]:
print('Financial file found')
"""search for cargo manifest"""
if filter1 in file_list[1]:
print('Cargo manifest found')
"""search for adress file"""
if filter2 in file_list[2] and filter2 in file_list[2] and filter2 in file_list[2]:
print('Financial file found')
到目前为止,我设法得到下面的代码。但是我如何处理不同长度的列表呢?和变量的使用例如:filterx代替filter1
"""loop through the file_list"""
for file in file_list:
print("Identify file:", file)
#identify file in list with lists in it
if filter[0][0] in file and filter[0][1] in file:
print('***Financial file found')
该all函数可用于根据文件名检查过滤器的元素:
def matches(filter, filename):
return all(x in filename for x in filter)
要查找与给定过滤器匹配的文件,您将遍历文件列表并应用于match每个项目:
def get_filename(filter, files):
for f in files:
if matches(filter, f)
return f
这可以使用以下next功能以更短的方式表达:
def get_filename(filter, files):
return next((f for f in files if matches(filter, f)), None)
next使用第二个参数调用会使其返回,None而不是在没有匹配文件时引发错误。
现在您可以检查所有文件。我建议更进一步,使用字典标记过滤器:
filters = {
'finance': ['employer','finance'],
'manifest': ['manifest'],
'address': ['epmloyer', 'adress', 'home'],
}
for label, filter in filters.items():
file = get_filename(filter, files)
if file:
print(f'Found {label} file: {file}')
您可以更进一步,创建您找到的文件的字典:
found_files = {label: get_filename(filter, files) for label, filter in filters.items()}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。