[英]How to get the last date for each ID in a list?
我有一个非常有趣的项目,它可能会使我们所有人受益。 如果该日期时间低于my_time
,我会尝试获取my_cars
每个车辆 ID 的最后日期my_time
。
这是my_cars
my_cars = [['Audi', '111', 'White', 'True', 'NY', '06-09-2020', '10:11:32'],
['Audi', '111', 'White', 'True', 'BS', '06-09-2020', '10:11:32'],
['Volkswagen', '222', 'Blue', 'False', 'BR', '06-09-2020', '11:26:21'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '14:51:45'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '15:59:45']
['Opel', '555', 'Black', 'True', 'ER', '06-09-2020', '16:30:00']]
这是我的代码:
my_time = datetime.datetime.strptime('2020-09-06 16:15:00', '%Y-%m-%d %H:%M:%S')
date_times = []
results = []
date_times = []
for row in my_cars:
date_time1 = row[-2] + row[-1]
date_time2 = datetime.datetime.strptime(row[-2] + row[-1] , '%d-%m-%Y%H:%M:%S')
date_times.append(date_time2)
if date_time2 == max(dt for dt in date_times if dt < my_time):
results.append(row)
print(results)
这是输出:
[['Audi', '111', 'White', 'True', 'NY', '06-09-2020', '10:11:32'],
['Audi', '111', 'White', 'True', 'BS', '06-09-2020', '10:11:32'],
['Volkswagen', '222', 'Blue', 'False', 'BR', '06-09-2020', '11:26:21'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '14:51:45'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '15:59:45']]
这是所需的输出:
[['Audi', '111', 'White', 'True', 'NY', '06-09-2020', '10:11:32'],
['Audi', '111', 'White', 'True', 'BS', '06-09-2020', '10:11:32'],
['Volkswagen', '222', 'Blue', 'False', 'BR', '06-09-2020', '11:26:21'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '15:59:45']]
您可以使用<
来检查一个日期时间是否低于另一个日期时间:
if car_time < my_time:
result.append(car)
因此,您只想显示给定的车辆一次,并且始终显示最新的日期。 鉴于您的列表是否按 DateTime 排序,这是我的解决方案:
new_cars = []
your_time = datetime.strptime('2020-09-06 16:15:00', '%Y-%m-%d %H:%M:%S')
for car in reversed(cars):
if your_time > datetime.strptime(car[-2] + car[-1] , '%d-%m-%Y%H:%M:%S'):
for new_car in new_cars:
# If the vehicle already in the list break the loop -> for else statement won't run ->
# this car won't be added to the new list
if car[:-2] == new_car[:-2]:
break
else:
new_cars.append(car)
反转 new_car 列表后,输出为:
[['Audi', '111', 'White', 'True', 'NY', '06-09-2020', '10:11:32']
['Audi', '111', 'White', 'True', 'BS', '06-09-2020', '10:11:32']
['Volkswagen', '222', 'Blue', 'False', 'BR', '06-09-2020', '11:26:21']
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '15:59:45']]
如果您不需要按 DateTime 排序的“汽车”列表,您可以像这样轻松地对其进行排序:
sorted(cars, key=lambda car: datetime.strptime(car[-2] + car[-1] , '%d-%m-%Y%H:%M:%S'))
在这种情况下,完整的代码与您的日期限制如下所示:
from datetime import datetime
cars = [['Audi', '111', 'White', 'True', 'NY', '06-09-2020', '10:11:32'],
['Audi', '111', 'White', 'True', 'BS', '06-09-2020', '10:11:32'],
['Volkswagen', '222', 'Blue', 'False', 'BR', '06-09-2020', '11:26:21'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '14:51:45'],
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '15:59:45'],
['Opel', '555', 'Black', 'True', 'ER', '06-09-2020', '16:30:00'],
]
# Use this only if the 'cars' list not necessary listed by the given datetime.
cars = sorted(cars, key=lambda car: datetime.strptime(car[-2] + car[-1] , '%d-%m-%Y%H:%M:%S'), reverse=True)
new_cars = []
your_time = datetime.strptime('2020-09-06 16:15:00', '%Y-%m-%d %H:%M:%S')
for car in cars:
if your_time > datetime.strptime(car[-2] + car[-1] , '%d-%m-%Y%H:%M:%S'):
for new_car in new_cars:
# If the vehicle already in the list break the loop -> for else statement won't run ->
# this car won't be added to the new list
if car[:-2] == new_car[:-2]:
break
else:
new_cars.append(car)
再次反转输出:
[['Audi', '111', 'White', 'True', 'NY', '06-09-2020', '10:11:32']
['Audi', '111', 'White', 'True', 'BS', '06-09-2020', '10:11:32']
['Volkswagen', '222', 'Blue', 'False', 'BR', '06-09-2020', '11:26:21']
['Mercedes', '333', 'Green', 'True', 'BE', '06-09-2020', '15:59:45']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.