Python 比较字典中列表中任意数量的日期

Python 比较字典中列表中任意数量的日期,python,list,date,dictionary,Python,List,Date,Dictionary,我有一本这样的日期字典(这里的键与其他工作相关,需要考虑): 现在,我想在每个列表中找到最早的日期。最后,我需要找出最早的日期,并返回该日期和密钥 如果我手动完成我在此处尝试执行的操作: **key 2**, `7-12-2012` is the earliest. **key 5**, `10-12-2012` is the earliest. **key 7**, `13-12-2012` is the earliest. 2012年7月12日是最早的日期,所以我应该返回2 此处需要注意的

我有一本这样的日期字典(这里的键与其他工作相关,需要考虑):

现在,我想在每个列表中找到最早的日期。最后,我需要找出最早的日期,并返回该日期和密钥

如果我手动完成我在此处尝试执行的操作:

**key 2**, `7-12-2012` is the earliest.
**key 5**, `10-12-2012` is the earliest.
**key 7**, `13-12-2012` is the earliest.
2012年7月12日是最早的日期,所以我应该返回
2

此处需要注意的事项:

**key 2**, `7-12-2012` is the earliest.
**key 5**, `10-12-2012` is the earliest.
**key 7**, `13-12-2012` is the earliest.
  • 字典中的数据是在运行时动态创建的
  • 字典中的列表不是固定长度的
  • 这是我尝试过的,但只比较了两个日期:

    ...
    ...
    # this value would be dynamically set during runtime
    expiryDates[item] = {2: ['8-12-2012', '9-12-2012', '7-12-2012], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    
    datesInBox = []
    dict_earliest_expiration = defaultdict(list)
    
    for n in expiryDates:
        datesInBox = expiryDates[n] # when n = 2; datesInBox = ['8-12-2012', '9-12-2012']
        d1 = time.strptime(datesInBox[0], "%d-%m-%Y")
        d2 = time.strptime(datesInBox[1], "%d-%m-%Y")
        if d1 < d2:
            dict_earliest_expiration[n] = d1
        else:
            dict_earliest_expiration[n] = d2
    
    。。。
    ...
    #此值将在运行时动态设置
    过期日期[项目]={2:['8-12-2012','9-12-2012','7-12-2012],5:['10-12-2012','11-12-2012'],7:['13-12-2012']
    datesInBox=[]
    dict\u最早到期时间=默认dict(列表)
    对于n,在到期日:
    datesInBox=到期日[n]#n=2时;datesInBox=['8-12-2012','9-12-2012']
    d1=time.strtime(日期框[0],%d-%m-%Y”)
    d2=time.strTime(日期框[1],%d-%m-%Y”)
    如果d1

    任何帮助都将不胜感激。

    反复阅读您的dict或直接传递密钥。将列表转换为熊猫系列并对其排序

    import pandas as pd
    d={2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    
    for key,value in d.items():
        print(key,pd.to_datetime(pd.Series(value)).sort_values().iloc[0])
    
    输出

    (2, Timestamp('2012-07-12 00:00:00'))
    (5, Timestamp('2012-10-12 00:00:00'))
    (7, Timestamp('2012-12-13 00:00:00'))
    
    如果你只关心日期

    for key,value in d.items():
        print(key,pd.to_datetime(pd.Series(value)).dt.date.sort_values().iloc[0])
    
    输出:

    (2, datetime.date(2012, 7, 12))
    (5, datetime.date(2012, 10, 12))
    (7, datetime.date(2012, 12, 13))
    
    key: 2, Earliest Date: 07-12-2012 
    key: 5, Earliest Date: 10-12-2012 
    key: 7, Earliest Date: 12-13-2012 
    
    根据给出的示例表示日期

    for key,value in d.items():
        print('key: {}, Earliest Date: {} '.format(key,pd.to_datetime(pd.Series(value)).dt.date.sort_values().iloc[0].strftime("%m-%d-%Y")))
    
    输出:

    (2, datetime.date(2012, 7, 12))
    (5, datetime.date(2012, 10, 12))
    (7, datetime.date(2012, 12, 13))
    
    key: 2, Earliest Date: 07-12-2012 
    key: 5, Earliest Date: 10-12-2012 
    key: 7, Earliest Date: 12-13-2012 
    

    反复使用dict或直接传递密钥。将列表转换为熊猫系列并对其排序

    import pandas as pd
    d={2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    
    for key,value in d.items():
        print(key,pd.to_datetime(pd.Series(value)).sort_values().iloc[0])
    
    输出

    (2, Timestamp('2012-07-12 00:00:00'))
    (5, Timestamp('2012-10-12 00:00:00'))
    (7, Timestamp('2012-12-13 00:00:00'))
    
    如果你只关心日期

    for key,value in d.items():
        print(key,pd.to_datetime(pd.Series(value)).dt.date.sort_values().iloc[0])
    
    输出:

    (2, datetime.date(2012, 7, 12))
    (5, datetime.date(2012, 10, 12))
    (7, datetime.date(2012, 12, 13))
    
    key: 2, Earliest Date: 07-12-2012 
    key: 5, Earliest Date: 10-12-2012 
    key: 7, Earliest Date: 12-13-2012 
    
    根据给出的示例表示日期

    for key,value in d.items():
        print('key: {}, Earliest Date: {} '.format(key,pd.to_datetime(pd.Series(value)).dt.date.sort_values().iloc[0].strftime("%m-%d-%Y")))
    
    输出:

    (2, datetime.date(2012, 7, 12))
    (5, datetime.date(2012, 10, 12))
    (7, datetime.date(2012, 12, 13))
    
    key: 2, Earliest Date: 07-12-2012 
    key: 5, Earliest Date: 10-12-2012 
    key: 7, Earliest Date: 12-13-2012 
    

    我会慢慢来,这样你就能看到整个过程。首先,反转指令:使用时间作为键,前一个键作为值:

    exp = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    rev = []
    
    for key, val_list in exp.items():
        for val in val_list:
            rev[time.strptime(val, "%d-%m-%Y")] = key
    
    正在清理表示,
    rev
    现在

    {
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday=13): 7, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday= 8): 2, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday= 7): 2, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday= 9): 2, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday=11): 5, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday=10): 5
    }
    
    现在,只需最早打印钥匙即可:

    >>> rev[min(rev)]
    2
    

    如果你愿意,你可以把它折叠成一个听写理解和一个简单的电话。

    我会慢慢地处理,这样你就可以看到整个过程。首先,反转指令:使用时间作为键,前一个键作为值:

    exp = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    rev = []
    
    for key, val_list in exp.items():
        for val in val_list:
            rev[time.strptime(val, "%d-%m-%Y")] = key
    
    正在清理表示,
    rev
    现在

    {
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday=13): 7, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday= 8): 2, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday= 7): 2, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday= 9): 2, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday=11): 5, 
        time.struct_time(tm_year=2012, tm_mon=12, tm_mday=10): 5
    }
    
    现在,只需最早打印钥匙即可:

    >>> rev[min(rev)]
    2
    

    如果愿意,您可以将其折叠为一个dict理解和一个简单的调用。

    您可以将所有字符串转换为日期,然后使用函数:

    import time
    
    data = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    d2 = {k: [time.strptime(e, "%d-%m-%Y") for e in v] for k, v in data.items()}
    print(min(d2, key=lambda e: min(d2[e])))
    
    输出

    2
    
    2
    
    2
    
    或者,您可以预先计算字典中每个键的最小值:

    data = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    d2 = {k: min(time.strptime(e, "%d-%m-%Y") for e in v) for k, v in data.items()}
    print(min(d2, key=lambda e: d2[e]))
    
    输出

    2
    
    2
    
    2
    
    最后,您可以迭代键、值对,而不是迭代键:

    data = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    d2 = {k: min(time.strptime(e, "%d-%m-%Y") for e in v) for k, v in data.items()}
    print(min(d2.items(), key=lambda t: t[1])[0])
    
    输出

    2
    
    2
    
    2
    

    您可以将所有字符串转换为日期,然后使用以下函数:

    import time
    
    data = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    d2 = {k: [time.strptime(e, "%d-%m-%Y") for e in v] for k, v in data.items()}
    print(min(d2, key=lambda e: min(d2[e])))
    
    输出

    2
    
    2
    
    2
    
    或者,您可以预先计算字典中每个键的最小值:

    data = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    d2 = {k: min(time.strptime(e, "%d-%m-%Y") for e in v) for k, v in data.items()}
    print(min(d2, key=lambda e: d2[e]))
    
    输出

    2
    
    2
    
    2
    
    最后,您可以迭代键、值对,而不是迭代键:

    data = {2: ['8-12-2012', '9-12-2012', '7-12-2012'], 5: ['10-12-2012', '11-12-2012'], 7: ['13-12-2012']}
    d2 = {k: min(time.strptime(e, "%d-%m-%Y") for e in v) for k, v in data.items()}
    print(min(d2.items(), key=lambda t: t[1])[0])
    
    输出

    2
    
    2
    
    2
    

    我一直收到一个“NameError:名称'rev'未定义”。尝试过谷歌搜索,但没有结果。是否有超出exp值的内容?我切断了初始化行。我道歉。现在已修复。我不断收到“名称错误:名称'rev'未定义”。尝试过谷歌搜索,但没有结果。是否有超出exp值的内容?我切断了初始化行。我道歉。现在修好了。