带有最近日期的Python筛选器列表

带有最近日期的Python筛选器列表,python,datetime,Python,Datetime,我有一份产品清单,上面有产品名称和时间。我想创建一个列表,检索该类产品的最新日期。我最初的计划是为每种产品创建一个子列表,并获取最新的子列表。我想知道是否有更有效的方法做这件事,因为清单上可能还有更多 products = [{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'}, {'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'}, {'name':

我有一份产品清单,上面有产品名称和时间。我想创建一个列表,检索该类产品的最新日期。我最初的计划是为每种产品创建一个子列表,并获取最新的子列表。我想知道是否有更有效的方法做这件事,因为清单上可能还有更多

products = [{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
            {'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]


Veggies = [x for x in products if x['name'] == 'Veggie']
...
new_products.append(get_recent(Veggies))
期望输出:

new_products = [{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
            {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]

提前谢谢

您可以按任意键排序词典列表。 在本例中,产品(或蔬菜)被传递给内置​函数,该函数接受关键字参数键。Itemgetter创建一个callable,该callable接受来自product(或Veggies)数组的单个项作为输入,并返回一个值,该值将用作排序的基础

从操作员导入itemgetter
产品=[{'name':'Veggie','time':'2020-01-06T07:53:29Z'},
{'name':'Veggie','time':'2020-02-02T07:12:13Z'},
{'name':'Fruit','time':'2020-01-06T07:53:29Z'},
{'name':'Fruit','time':'2020-02-02T07:12:13Z'}]
按日期排序的行=已排序(产品,键=itemgetter('time'))
打印(按日期打印行)
输出

[{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'}, 
{'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'}, 
{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'}, 
{'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]



这里有一个使用集合的选项。defaultdict:

从集合导入defaultdict
从pprint导入pprint
产品=[
{'name':'Veggie','time':'2020-01-06T07:53:29Z'},
{'name':'Veggie','time':'2020-02-02T07:12:13Z'},
{'name':'Fruit','time':'2020-01-06T07:53:29Z'},
{'name':'Fruit','time':'2020-02-02T07:12:13Z'}
]
d=默认DICT(列表)
对于产品中的产品:
d[产品['name']]。追加(产品['time'])
new_products=[{'name':item,'time':max(times)}对于item,时间在d.items()中
结果将是:

pprint(新产品)
[{'name':'Veggie','time':'2020-02-02T07:12:13Z'},
{'name':'Fruit','time':'2020-02-02T07:12:13Z'}]

我认为您需要先对数据进行排序,然后再进行缩减以消除重复记录

从functools导入reduce
从运算符导入itemgetter
产品=[{'name':'Veggie','time':'2020-01-06T07:53:29Z'},
{'name':'Veggie','time':'2020-02-02T07:12:13Z'},
{'name':'Fruit','time':'2020-01-06T07:53:29Z'},
{'name':'Fruit','time':'2020-02-02T07:12:13Z'}]
def验证唯一产品(a、b):
如果地图中的b['name'](λx:x['name'],a):
归还
a、 附加(b)
归还
已排序的产品=已排序的(产品,键=itemgetter('time'),反向=True)
唯一产品=减少(验证唯一产品,分类产品,[])
印刷品(独特的产品)
输出
您可以遍历字典并生成一组产品类型,然后遍历它以生成子列表并获取最新的。它不会加快任何速度,但至少您没有手动创建子列表,所以它会按日期对它们进行排序。它缺少删除不需要的对象。谢谢你的洞察力。我可以把它扔进去,因为它没有捕捉到原始对象。而是用最近的时间创建一个新的列表。这是一个问题吗?当然还有其他解决方案,也可能有一个保留原始对象的解决方案,但我看不出有什么好的理由。我尽量用最简单的方法,不用担心。我很乐意帮忙。
>> [{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'}, {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]