是否给完整路径指定部分路径名的变量?

时间:2018-10-19 08:43:20

标签: python loops dictionary

这是一个更好的版本,包括我到目前为止所做的事情:

此词典: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有效地做同样的事情?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

对于for i in list(sfiles)i不是列表的索引,而是已经依次分配给每个元素,因此循环必须是:

for i in list(sfiles):
    if shape1 in i.split('\\')[-1]:
        print(i)
        …
  

我怎样才能有效地对sh2做同样的事情?

定义一个包含循环的函数,并将sh1sh2传递为参数e。 g。:

def matching(shape):
    for i in list(sfiles):
        if shape in i.split('\\')[-1]:
            return i
  

将匹配的sfile的完整路径分配给sh1

sh1 = matching(sh1)

答案 2 :(得分:0)

您不是真的在使用字典。我建议您重建另一个以文件 name 为键的字典(使用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检索数据