Python:给定两个文件名列表,根据日期部分查找常用文件名

Python:给定两个文件名列表,根据日期部分查找常用文件名,python,Python,我有两个数据源,每个都有一个文件列表。任务是比较两个列表并找出具有相同时间戳的文件,然后根据输入参数输出结果列表,该参数与我希望看到的源有关 一个复杂性是,我们无法进行简单的文件名比较,因为它们是用关于源的字符串包装的,我们需要首先提取日期部分,然后只进行比较,然后返回原始文件名 没有太多的Python工作知识,我觉得我所尝试的不够有效。例如,我能够从两个源中提取日期部分,并将它们与一段代码进行比较,但不确定如何将它们压缩回原始文件名 listA=[”apple://folderx/folder

我有两个数据源,每个都有一个文件列表。任务是比较两个列表并找出具有相同时间戳的文件,然后根据输入参数输出结果列表,该参数与我希望看到的源有关

一个复杂性是,我们无法进行简单的文件名比较,因为它们是用关于源的字符串包装的,我们需要首先提取日期部分,然后只进行比较,然后返回原始文件名

没有太多的Python工作知识,我觉得我所尝试的不够有效。例如,我能够从两个源中提取日期部分,并将它们与一段代码进行比较,但不确定如何将它们压缩回原始文件名

listA=[”apple://folderx/foldery/sourcea_20190326-0.json", "apple://folderx/foldery/sourcea_20190323-1.json", "apple://folderx/foldery/sourcea_20190324-1.json"]
listB=[”apple://folderx/folderz/source_b_20190324-0.json", "apple://folderx/folderz/source_b_20190326-0.json"]
mySource=['A','B']
所有日期={}
对于mySource中的s:
文件列表=[]
日期列表=[]
如果s==“A”:
fileList=listA
elif s==“B”:
fileList=listB
对于文件列表中的f:
日期=f.rsplit('''',1)[-1]。拆分('-')[0]
如果日期列表中没有日期:
dateList.append(日期)
如果len(日期列表)>0:
allDates[s]=日期列表
其他:
时间。睡眠(10)
如果len(文件列表)==0:
引发节点异常
列表(集合(所有日期['A'])。交叉点(所有日期['B']))
这段代码只返回两个源文件之间的公共日期列表

输出为:

['20190326','20190324']。
我要找的是

listA=[”apple://folderx/foldery/sourcea_20190326-0.json", "apple://folderx/foldery/sourcea_20190324-1.json"] 
listB=[”apple://folderx/folderz/source_b_20190324-0.json", "apple://folderx/folderz/source_b_20190326-0.json"] 

您可以为将日期映射到文件名的
listA
listB
构建dict,使用set intersection获取公共键(日期),并将日期映射回
listA
listB
的文件名:

a, b = {}, {}
for l, d in (listA, a), (listB, b):
    for f in l:
        d.setdefault(f.rsplit('_', 1)[-1].split('-')[0], []).append(f)
common_keys = a.keys() & b.keys()
listA, listB = ([f for k in common_keys for f in d[k]] for d in (a, b))
因此,鉴于:

listA = ["apple://folderx/foldery/sourcea_20190326-0.json", "apple://folderx/foldery/sourcea_20190323-1.json", "apple://folderx/foldery/sourcea_20190324-1.json"]
listB = ["apple://folderx/folderz/source_b_20190324-0.json", "apple://folderx/folderz/source_b_20190326-0.json", "apple://folderx/folderz/source_c_20190324-0.json"]
listA
变成:

['apple://folderx/foldery/sourcea_20190324-1.json', 'apple://folderx/foldery/sourcea_20190326-0.json']
['apple://folderx/folderz/source_b_20190324-0.json', 'apple://folderx/folderz/source_c_20190324-0.json', 'apple://folderx/folderz/source_b_20190326-0.json']
listB
变成:

['apple://folderx/foldery/sourcea_20190324-1.json', 'apple://folderx/foldery/sourcea_20190326-0.json']
['apple://folderx/folderz/source_b_20190324-0.json', 'apple://folderx/folderz/source_c_20190324-0.json', 'apple://folderx/folderz/source_b_20190326-0.json']

谢谢你的回复!看起来a、b只接受列表中最后一个日期相同的文件,在某些情况下,03/26将有多个文件,如[”apple://folderx/foldery/sourcea_20190326-0.json", "apple://folderx/foldery/sourcea_20190326-1.json“],我们如何才能做到这一点?继续问,当普通的日期只有一天时,似乎很难做到这一点,输出变成字符。
operator.itemgetter
的问题是,当给定多个键时,它返回一个元组,但当只给定一个键时,它直接返回值,而不是值的元组。我通过迭代公共键而不是使用
itemgetter
修复了代码。