给出一个变量的完整路径,其中包含部分路径名称?

3
这是一个更好的版本,包括我目前所做的工作:

这个字典:sfiles

{'C:\\Users\\user\\Desktop\\05052\\ASTTOM\\ASTTOM': [], 
'C:\\Users\\user\\Desktop\\05052\\ASTIK\\ASTIK': [], 
'C:\\Users\\user\\Desktop\\05052\\ROADS\\ROADS': []}

我希望检查是否存在 sh1:

sh1
u'ASTTOM'

同时

sh2
u'ASTIK'

我希望将与sfiles匹配的完整路径分配给sh1。

我的做法:

   for i in list(sfiles):
       if shape1 in os.path.basename(i):
            print((i))
            shape1 = i

这个方法正确吗?如何高效地为sh2执行相同的操作?

1
你可以使用 os.path.basename 代替分割。在字典的键中查找子字符串并不是一种非常高效的方法。创建一个以 basename 为键、全路径(如果需要)+ 列表为值的字典,然后查找将是瞬间完成的。 - Jean-François Fabre
你能建议一种使用完整路径进行sh1和sh2检查和分配的方法吗?也许可以用zip? - user10528055
3个回答

1

据我理解,您想找出sh1(称为shape1)在其最后一部分中的路径。因此,您可以按照以下方式执行:

sfiles = {'C:\\Users\\user\\Desktop\\05052\\ASTTOM\\ASTTOM': [],
          'C:\\Users\\user\\Desktop\\05052\\ASTIK\\ASTIK': [],
          'C:\\Users\\user\\Desktop\\05052\\ROADS\\ROADS': []
          }

for pth in sfiles.keys():
    if shape1 in pth.split("\\")[-1]:
       print(pth)

0
使用`for i in list(sfiles)`,`i`不是列表的索引,而是依次分配给每个元素的值,因此您的循环应该是这样的:
for i in list(sfiles):
    if shape1 in i.split('\\')[-1]:
        print(i)
        …

如何以高效的方式对sh2执行相同的操作?
定义一个包含循环的函数,并将sh1或sh2作为参数传递,例如:
def matching(shape):
    for i in list(sfiles):
        if shape in i.split('\\')[-1]:
            return i

将匹配的sfiles的完整路径分配给sh1。
sh1 = matching(sh1)

你能详细说明如何完成sh1和sh2部分吗? - user10528055
@user10528055 - 我修改了答案。 - Armali
你认为使用“for i,j in list(sfiles)”的zip函数可以吗? - user10528055
@user10528055 - 我们无法将list(sfiles)解包到两个for变量中。 - Armali

0

你并没有真正使用你的字典。我建议你用文件名称作为键(使用os.path.basename而不是str.split)重新构建另一个字典,将完整路径和列表作为值的元组。

import os

data = {'C:\\Users\\user\\Desktop\\05052\\ASTTOM\\ASTTOM': [],
'C:\\Users\\user\\Desktop\\05052\\ASTIK\\ASTIK': [],
'C:\\Users\\user\\Desktop\\05052\\ROADS\\ROADS': []}

new_data = {os.path.basename(path): (path,value) for path,value in data.items()}

长成什么样子:

>>> new_data
{'ASTIK': ('C:\\Users\\user\\Desktop\\05052\\ASTIK\\ASTIK', []),
 'ASTTOM': ('C:\\Users\\user\\Desktop\\05052\\ASTTOM\\ASTTOM', []),
 'ROADS': ('C:\\Users\\user\\Desktop\\05052\\ROADS\\ROADS', [])}

然后你可以拥有 O(1) 的查找和测试:

shape1 = "ASTIK"
print(shape1 in new_data,new_data.get(shape1))

打印:

True ('C:\\Users\\user\\Desktop\\05052\\ASTIK\\ASTIK', [])

(因为值在字典中,get检索数据)


你在问题中提到了代码的先前版本,可能是因为现在它似乎正在工作。传递list(data)使其仅访问键,这样是正确的吗? - user10528055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接