我有两个列表:这个:
list1(有更多项)
['C:\\Users\\user\\Desktop\\prog1\\merge\\AST\\AST.shp',
'C:\\Users\\user\\Desktop\\prog1\\merge\\ASTI\\ASTI.shp',
'C:\\Users\\user\\Desktop\\prog1\\merge\\ASTO\\ASTO.shp']
这:
list2(有更多项)
['C:\\Users\\user\\Desktop\\programs\\merge\\AST\\AST.shp',
'C:\\Users\\user\\Desktop\\programs\\merge\\ASTI\\ASTI.shp',
'C:\\Users\\user\\Desktop\\programs\\merge\\AWE\\AWE.shp', #THIS IS EXTRA
'C:\\Users\\user\\Desktop\\programs\\merge\\ASTO\\ASTO.shp']
如何确保该对与zip后另一个列表上的对应同名匹配?
也许我们与他们以前的文件夹匹配?喜欢:
if list1[0].split('\\')[-2] == list2[0].split('\\')[-2]:
final = [(f,s) for f,s in zip(list1,list2)]
final
需要最终输出:
[('C:\\Users\\user\\Desktop\\prog1\\merge\\AST\\AST.shp',
'C:\\Users\\user\\Desktop\\programs\\merge\\AST\\AST.shp'),etc..]
答案 0 :(得分:2)
我只是用collections.defaultdict()
对文件进行分组,然后在单独的列表中输出长度为2的对。
演示:
from os.path import basename
from collections import defaultdict
from pprint import pprint
f1 = [
"C:\\Users\\user\\Desktop\\prog1\\merge\\AST\\AST.shp",
"C:\\Users\\user\\Desktop\\prog1\\merge\\ASTI\\ASTI.shp",
"C:\\Users\\user\\Desktop\\prog1\\merge\\ASTO\\ASTO.shp",
]
f2 = [
"C:\\Users\\user\\Desktop\\programs\\merge\\AST\\AST.shp",
"C:\\Users\\user\\Desktop\\programs\\merge\\ASTI\\ASTI.shp",
"C:\\Users\\user\\Desktop\\programs\\merge\\AWE\\AWE.shp", # THIS IS EXTRA
"C:\\Users\\user\\Desktop\\programs\\merge\\ASTO\\ASTO.shp",
]
files = defaultdict(list)
for path in f1 + f2:
filename = path.split('\\')[-1]
files[filename].append(path)
pairs = [tuple(v) for k, v in files.items() if len(v) == 2]
pprint(pairs)
输出:
[('C:\\Users\\user\\Desktop\\prog1\\merge\\AST\\AST.shp',
'C:\\Users\\user\\Desktop\\programs\\merge\\AST\\AST.shp'),
('C:\\Users\\user\\Desktop\\prog1\\merge\\ASTI\\ASTI.shp',
'C:\\Users\\user\\Desktop\\programs\\merge\\ASTI\\ASTI.shp'),
('C:\\Users\\user\\Desktop\\prog1\\merge\\ASTO\\ASTO.shp',
'C:\\Users\\user\\Desktop\\programs\\merge\\ASTO\\ASTO.shp')]
注意:仅在Windows上使用os.path.basename()
从Windows路径中提取文件名。在Unix环境下,它根本不起作用。