2015-06-30 2 views
1

Я извлекаю данные из двух отдельных таблиц, как показано ниже.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

ответ

2

Вы должны создать кортеж (date, time) для каждого ключа

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

Спасибо! Только то, что я хотел! –

1

Ваш Интернет key кажется неправильным.

lambda item:item[0][1] 

всегда даст вам первый charachter элемента в [0] го индекса. Если ypu хочет сортировать по дате, используйте это как ключ.

key= lambda x :x[1] 
1

Это производит вывод, который вы хотите:

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

Что вы имеете в своем коде сортировки по второму вопросу первого пункта: item[0] является первым элементом, а item[0][1] является вторым пунктом того, что. Итак, вы сортировали по «n» в «Instamojo», «a» в «PayU» и т. Д.

operator.itemgetter имеет семантику, которую вы ищете; он выбирает кортеж с входа, в этом случае (второй элемент, третий элемент). Затем sorted (или list.sort) сортирует их лексикографически, так что, если даты совпадают, они сравниваются по времени.

+0

Спасибо за быстрый ответ! Мне хотелось чего-то подобного –