来自两个具有相同文件名的列表的压缩项目?

时间:2018-11-20 07:36:04

标签: python pandas

我有两个列表:这个:

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..]

1 个答案:

答案 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环境下,它根本不起作用。