在列表中的最年轻日期查找值

时间:2017-08-09 23:32:05

标签: python list datetime

我有这个日期和金额列表

dates_amount = [
    [datetime.datetime(2017, 1, 1, 0, 0), '15000.0'],
    [datetime.datetime(2017, 4, 1, 0, 0), '10000.0'],
    [datetime.datetime(2017, 7, 1, 0, 0), '13000.0']]

我正在尝试找到最年轻的日期,即距离现在最近的日期,并从该子列表中检索第二项。对于上面的示例,7/1/2017是最接近的,因此答案应为13000。我写了这段代码,但它产生了错误的输出:

max_date = max(x[:-1] for x in enumerate(dates_amount))
max_amount = ''
for date,amount in dates_amount:
    if date == max_date:
       max_amount = amount
       break
print("Last Date: {} ".format(max_date))
print("Last Amount: {} ".format(max_amount))

我看到的输出是:

Last Date: (2,) 
Last Amount:

错误是什么,如何纠正?

4 个答案:

答案 0 :(得分:4)

插入一些简单的跟踪打印语句,您将看到问题:

print ([x for x in enumerate(dates_amount)])
max_date = max(x[:-1] for x in enumerate(dates_amount))
print ("max_date", max_date)

输出:插入#newlines以帮助提高可读性

[(0, [datetime.datetime(2017, 1, 1, 0, 0), '15000.0']), 
 (1, [datetime.datetime(2017, 4, 1, 0, 0), '10000.0']),
 (2, [datetime.datetime(2017, 7, 1, 0, 0), '13000.0'])]
max_date (2,)

现在你看到了这个问题吗?当您enumerate列表时,您会得到( index value )的元组。使用此表示,x [: - 1]是除最后一个元素之外的所有元素,即项目的索引。您所做的就是找到列表中最大的索引,这只是查找len(dates_amount)的间接方式。

摆脱枚举。你所需要的只是

max_date = max(entry[0] for entry in dates_amount)

或许更好的方法是使用关键字段进行排序,然后抓住最后一个元素:

dates_amount.sort(key=lambda entry: entry[0])
print ("Last Amt:", dates_amount[-1][1])

输出:

Last Amt: 13000.0

答案 1 :(得分:2)

您不想使用列表列表。你想用dict。您可以将列表列表转换为类似的字典:

d = dict()
for l in dates_amount:
    d[l[0]] = l[1]

这将为您提供d = {datetime.datetime(2017, 1, 1, 0, 0): '15000.0', datetime.datetime(2017, 4, 1, 0, 0): '10000.0', datetime.datetime(2017, 7, 1, 0, 0): '13000.0'}

然后,您可以找到max_key = max(d)的最大dict密钥和d[max_key]的相应值

答案 2 :(得分:1)

问题在于您的max_date,您可以通过print语句为您提供的时髦输出看到。

由于您没有正确获取日期,后续循环也无法正常工作。

使这项工作的选项是:

max_date = max(x[0] for x in dates_amount)

答案 3 :(得分:1)

你可以这样做:

max_date, max_amount = max(dates_amount)
print("Last Date: {} ".format(max_date))
print("Last Amount: {} ".format(max_amount))

这使用了列表比较逐个元素的事实。如果您希望明确,可以将第一行替换为:

max_date, max_amount = max(dates_amount, key=lambda x: x[0])