我有两个列表,一个有一堆路径,例如:“C:\vol001\ABC123.xls”,另一个有一堆名称,例如:“ABC123”。如果名称在路径中,我正在寻找路径。所以对于上面的例子,程序会输出“C:\vol001\ABC123.xls”。
到目前为止,我一直在尝试使用 in 运算符,但我不确定如何返回路径。
for name in list1:
if name in list2:
return path in list2
您的初始解决方案不正确。实际上,您是在问“是否有'名称'等于列表中的项目之一”。但是如果你想测试遏制,即“'name'是否是列表中任何项目的一部分”,你应该使用类似下面的代码:
for name in l2:
return [x for x in l1 if name in x]
它返回匹配路径的列表。实际上,以更 Python 的方式重写的循环只有 2 个(我记得它被称为“列表理解”,如果我错了,那些更熟悉术语的人会帮我解决)。
考虑到您的评论,名称出现在路径中的哪个位置并不重要(即“C:\ABC123\test.png”和“C:\vol01\ABC123.xml”都与查询“ABC123”匹配) ,我们不考虑文件系统路径的结构,但可以进行纯字符串匹配。
成为paths
所有路径names
的列表,成为所有名称的列表,然后成为name
您正在寻找的名称
(path for path in paths if name in path)
是生成所有与名称匹配的路径的生成器。
dict ( ( (name, [path for path in paths if name in path] ) for name in names) )
创建一个字典,其键是名称,其值是包含相应名称的所有路径。你可以像这样使用它:
paths = [....]
names = [....]
d = dict ( ( (name, [path for path in paths if name in path] ) for name in names) )
print ('The name "ABC" is contained in: {}'.format (d ['ABC'] ) )
print ('The name "XYZ" is contained in: {}'.format (d ['XYZ'] ) )
print ('The name "pron" is contained in: {} different paths'.format (len (d ['pron'] ) if 'pron' in d else 0) )
我认为这就是你想要的:
for path in list1:
for name in list2:
if name in path:
return path
else:
return None # not found
这对你有用吗?
new_paths = [] # create list for the paths to be kept
for path in paths: # cycle through paths
for name in names: # cycle through names
if name in path: # check if path contains the name
new_paths.append(path) # path is good, so add to the list
return os.path.dirname(name)
请记住,import os.path
如果您还没有运行,则必须运行。请参阅os.path 模块的文档。