最早日期的Python查询列表

最早日期的Python查询列表,python,list,date,dictionary,time,Python,List,Date,Dictionary,Time,我的查询在列表中返回以下内容: "Alex";"275467125";"2015-02-03 02:55:36-05";"1" "Alex";"275467125";"2015-01-13 02:09:39-05";"1" "Alex";"275467125";"2015-01-05 04:13:35-05";"1" "Alex";"275467125";"2014-12-27 04:55:47-05";"1" "Alex";"275467125";"2014-12-27 04:54:52-05

我的查询在列表中返回以下内容:

"Alex";"275467125";"2015-02-03 02:55:36-05";"1"
"Alex";"275467125";"2015-01-13 02:09:39-05";"1"
"Alex";"275467125";"2015-01-05 04:13:35-05";"1"
"Alex";"275467125";"2014-12-27 04:55:47-05";"1"
"Alex";"275467125";"2014-12-27 04:54:52-05";"1"
"Alex";"275467125";"2014-12-07 03:13:24-05";"1"
"Alex";"275467125";"2014-12-04 03:34:56-05";"1"
"Alex";"275467125";"2014-12-02 04:16:33-05";"1"
"Ali";"275464747";"2016-02-17 10:52:12-05";"2"
"Alladin";"275467455";"2016-03-13 06:51:52-04";"2"
"Alladin";"275467455";"2016-03-13 06:51:47-04";"2"
"Anna";"275467401";"2016-03-26 03:56:41-04";"1"
"Anna";"275467401";"2016-03-26 03:55:21-04";"1"
"Anna";"275467401";"2016-03-21 23:04:28-04";"1"
"Anna";"275467401";"2016-02-12 13:24:44-05";"1"
"Anna";"275467401";"2015-12-03 08:20:35-05";"1"
"Anna";"275467401";"2015-11-09 04:18:27-05";"1"
"Anna";"275467401";"2015-11-09 04:11:59-05";"1"
"Anna";"275467401";"2015-09-13 21:27:12-04";"1"
我想用最古老的记录创建一本人名词典。我发现:

oldestlist = {d[0]:d[2] for d in records}

这会返回一个正确的答案,但我担心的是,如果给我一个没有按日期/时间降序排列的列表,它将无法提供正确的答案。创建具有名称和最早日期的词典的最佳方法是什么?

因为您需要每个
名称的最后一条记录,而不是使用
dict来显式地执行该操作,所以请设置查询集,以便对名称执行
分组操作。在Django中,您可以使用
。注释
,如下所述:

因此,您的查询集应该如下所示:

YourModel.objects.values('name_column').annotate(latest_date=Max('date'))


另外一条信息,您应该与queryset一起使用,以确保数据始终以描述顺序返回,其中
-
在需要列表时确保描述顺序

将给定的“列表”转换为实际的列表格式有点令人沮丧。如果无法在查询本身中处理此任务,可以尝试:

from itertools import groupby
from operator import itemgetter

lst = '''"Alex";"275467125";"2015-02-03 02:55:36-05";"1",
"Alex";"275467125";"2015-01-13 02:09:39-05";"1",
"Alex";"275467125";"2015-01-05 04:13:35-05";"1",
"Alex";"275467125";"2014-12-27 04:55:47-05";"1",
"Alex";"275467125";"2014-12-27 04:54:52-05";"1",
"Alex";"275467125";"2014-12-07 03:13:24-05";"1",
"Alex";"275467125";"2014-12-04 03:34:56-05";"1",
"Alex";"275467125";"2014-12-02 04:16:33-05";"1",
"Ali";"275464747";"2016-02-17 10:52:12-05";"2",
"Alladin";"275467455";"2016-03-13 06:51:52-04";"2",
"Alladin";"275467455";"2016-03-13 06:51:47-04";"2",
"Anna";"275467401";"2016-03-26 03:56:41-04";"1",
"Anna";"275467401";"2016-03-26 03:55:21-04";"1",
"Anna";"275467401";"2016-03-21 23:04:28-04";"1",
"Anna";"275467401";"2016-02-12 13:24:44-05";"1",
"Anna";"275467401";"2015-12-03 08:20:35-05";"1",
"Anna";"275467401";"2015-11-09 04:18:27-05";"1",
"Anna";"275467401";"2015-11-09 04:11:59-05";"1",
"Anna";"275467401";"2015-09-13 21:27:12-04";"1"'''

broken_list = lst.split(',')
stripped = [item.replace('\n', '') for item in broken_list]

rebuilt = []
for line in stripped:
    line = line.split(';')
    rebuilt.append([item.strip('"') for item in line])

# Now actually sorting this        
grouped = []
for key, group in groupby(rebuilt, key=itemgetter(0)):
    grouped.append(list(group))

sort_grouped = [sorted(item, key=itemgetter(2)) for item in grouped]
#sort_grouped = 

oldestlist = {d[0][0]:d[0][2] for d in sort_grouped}

我很接近。我发现最有效的答案是对我的原始代码进行了调整,但使用了sorted()函数

对于最新的,我会:

newestlist = {d[0]:d[2] for d in sorted(records)}
oldestlist = {d[0]:d[2] for d in sorted(records, reverse=True)}
对于最年长的人,我会:

newestlist = {d[0]:d[2] for d in sorted(records)}
oldestlist = {d[0]:d[2] for d in sorted(records, reverse=True)}

感谢所有回答的人。如果我使用queryset,我会记住django引用

您不需要对任何数据进行排序,只需使用defaultdict,检查当前日期与任何新日期,并相应更新:

s = """"Alex";"275467125";"2015-02-03 02:55:36-05";"1"
"Alex";"275467125";"2015-01-13 02:09:39-05";"1"
"Alex";"275467125";"2015-01-05 04:13:35-05";"1"
"Alex";"275467125";"2014-12-27 04:55:47-05";"1"
"Alex";"275467125";"2014-12-27 04:54:52-05";"1"
"Alex";"275467125";"2014-12-07 03:13:24-05";"1"
"Alex";"275467125";"2014-12-04 03:34:56-05";"1"
"Alex";"275467125";"2014-12-02 04:16:33-05";"1"
"Ali";"275464747";"2016-02-17 10:52:12-05";"2"
"Alladin";"275467455";"2016-03-13 06:51:52-04";"2"
"Alladin";"275467455";"2016-03-13 06:51:47-04";"2"
"Anna";"275467401";"2016-03-26 03:56:41-04";"1"
"Anna";"275467401";"2016-03-26 03:55:21-04";"1"
"Anna";"275467401";"2016-03-21 23:04:28-04";"1"
"Anna";"275467401";"2016-02-12 13:24:44-05";"1"
"Anna";"275467401";"2015-12-03 08:20:35-05";"1"
"Anna";"275467401";"2015-11-09 04:18:27-05";"1"
"Anna";"275467401";"2015-11-09 04:11:59-05";"1"
"Anna";"275467401";"2015-09-13 21:27:12-04";"1"
"""

import  csv
from collections import defaultdict

d = defaultdict(str)
for name,_, date, _ in csv.reader(s.splitlines(), delimiter=";"):
    if not d[name] or d[name] > date:
        d[name] = date


from pprint import pprint as pp

pp(dict(d))
输出:

 {'Alex': '2014-12-02 04:16:33-05',
 'Ali': '2016-02-17 10:52:12-05',
'Alladin': '2016-03-13 06:51:47-04',
'Anna': '2015-09-13 21:27:12-04'}

因为日期是y-m-d时间格式,所以可以安全地进行词典比较。

那么
记录是否实际上是一个列表?如果是,它包含什么类型的数据,是
[“Anna”(字符串)、id(int)、record_date(datetime)、some_other_int(int)]还是所有字符串?如果给出一个实际的python列表,这将更容易回答。@PavelGurkov您的数据分配是正确的。他们并不都是strings@roganjosh很抱歉,这不是一份真正的清单。我从我的pg管理员查询页面快速复制并粘贴了一份。@Echelon_One,日期的格式是什么,-x is8601提供了吗?OP似乎不希望dict中的顺序,他希望dict包含名称作为键,以及特定用户最早的记录时间作为值。更新了答案。感谢您的澄清:)但这肯定只有在订购输入时才有效。。。这就是原始帖子中的担忧吗?@roganjosh,为什么需要订购?我们只会在日期较新时更新用户值。@PadraicChanningham,对不起,但你不认为时区(-04,-05,至少看起来像时区)会干扰吗?Upvote,你教了我一些东西,比我的建议更干净:)@roganjosh,不用担心。但是你检查过这是什么排序吗?把你的记录弄乱,是什么让它按日期而不是名称排序?在我开始进一步测试后,我意识到如果我的记录一开始就弄乱了,我就会遇到这个问题。