Python在排序后重新排序列表

2024-09-29 01:25:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我从两个单独的表中获取数据,如下所示。你知道吗

list_table_1 = models.my_table_1.objects.all().order_by("-date_field","time_field") ## data from table 1
list_table_2 = models.my_table_2.objects.all().order_by("-date_field","time_field") ## data from table 2

然后我把这两个列表放在一个列表中,比如说my_list,并希望根据日期和时间以相反的顺序对它们进行排序,以便最新的顺序在最前面。所以我做了这个: my_list(key= lambda item:item[0][1],reverse= True)

然后我得到这个:

[['InstaMojo', datetime.date(2015, 6, 30), datetime.time(10, 50, 54), u'status',u'buyer_name'], ['InstaMojo',datetime.date(2015, 6, 29), datetime.time(19, 46, 22), u'status', u'buyer_name'],['PayU',datetime.date(2015, 6, 30), datetime.time(15, 39, 11), u'status', u'firstname'], ['PayU', datetime.date(2015, 6, 29), datetime.time(15, 37, 29), u'status', u'firstname']]

但我需要如下输出:

[['PayU',datetime.date(2015, 6, 30), datetime.time(15, 39, 11), u'status', u'firstname'],['InstaMojo', datetime.date(2015, 6, 30), datetime.time(10, 50, 54), u'status',u'buyer_name'] ,['InstaMojo',datetime.date(2015, 6, 29), datetime.time(19, 46, 22), u'status', u'buyer_name'], ['PayU', datetime.date(2015, 6, 29), datetime.time(15, 37, 29), u'status', u'firstname']]
这方面的任何帮助太好了!提前谢谢!你知道吗

顺便说一句,我在SO-link 1上研究了这些问题 和link 2


Tags: namefielddatetimedateobjectstimemodelsmy
3条回答

你的key似乎错了。你知道吗

lambda item:item[0][1]

总是在[0]索引处给出元素的第一个字符。如果ypu希望根据日期排序,请使用此键。你知道吗

key= lambda x :x[1]

应该为每个键创建一个元组(date, time)

my_list.sort(key=lambda x:(x[1], x[2]), reverse=True)

这将生成所需的输出:

my_list = sorted(my_list, key=operator.itemgetter(1, 2), reverse=True)

代码中的内容是按第一项的第二项排序:item[0]是第一项,item[0][1]是第二项。所以你是按Instamojo中的“n”和PayU中的“a”排序的

operator.itemgetter具有您要查找的语义;它从输入中选择一个元组,在本例中是(第二项,第三项)。然后sorted(或list.sort)按字典顺序对它们进行排序,这样如果日期相同,就按时间进行比较。你知道吗

相关问题 更多 >