1

我有两个列表,一个有一堆路径,例如:“C:\vol001\ABC123.xls”,另一个有一堆名称,例如:“ABC123”。如果名称在路径中,我正在寻找路径。所以对于上面的例子,程序会输出“C:\vol001\ABC123.xls”。

到目前为止,我一直在尝试使用 in 运算符,但我不确定如何返回路径。

for name in list1:
    if name in list2:
        return path in list2
4

5 回答 5

2

您的初始解决方案不正确。实际上,您是在问“是否有'名称'等于列表中的项目之一”。但是如果你想测试遏制,即“'name'是否是列表中任何项目的一部分”,你应该使用类似下面的代码:

for name in l2:
    return [x for x in l1 if name in x]

它返回匹配路径的列表。实际上,以更 Python 的方式重写循环只有 2 个(我记得它被称为“列表理解”,如果我错了,那些更熟悉术语的人会帮我解决)。

于 2012-12-14T18:26:40.967 回答
0

考虑到您的评论,名称出现在路径中的哪个位置并不重要(即“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) )
于 2012-12-15T14:15:03.293 回答
0

我认为这就是你想要的:

for path in list1:
    for name in list2:
        if name in path:
            return path
else:
    return None # not found
于 2012-12-14T18:53:48.600 回答
0

这对你有用吗?

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
于 2012-12-14T19:43:48.723 回答
-1

return os.path.dirname(name)

请记住,import os.path如果您还没有运行,则必须运行。请参阅os.path 模块的文档

于 2012-12-14T18:14:34.653 回答