【问题标题】:Python: Given two list of file names find common ones based on date partPython:给定两个文件名列表,根据日期部分查找常用文件名
【发布时间】:2019-04-03 22:05:35
【问题描述】:

我有两个数据源,每个都有一个文件列表。要求是比较两个列表并找出具有相同时间戳的文件,然后根据输入参数输出我想查看哪个源的结果列表。

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

没有大量使用 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']
allDates = {}
for s in mySource:
    fileList = []
    dateList = []

    if s == 'A':
        fileList = listA
    elif s == 'B':
        fileList = listB
    for f in fileList:
        date = f.rsplit('_',1)[-1].split('-')[0]
        if not date in dateList:
            dateList.append(date)

        if len(dateList) > 0:
            allDates[s] = dateList

        else:
            time.sleep(10)        
    if len(fileList) == 0:
        raise NoDataException

list(set(allDates['A']).intersection(allDates['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"] 

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以为listA 和listB 构建字典,将日期映射到文件名,使用集合交集获取公共键(日期),然后它们将日期映射回listA 和@987654324 的文件名@:

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

    listB 变为:

    ['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 来修复代码。
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2021-10-30
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多