我有这个日期和金额列表
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:
错误是什么,如何纠正?
答案 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])