Получить последний и уникальный элемент списка на основе даты - PullRequest
0 голосов
/ 26 марта 2020

Вот мои данные и код:

[
(datetime.date(2020, 3, 25), 'Raport'), 
(datetime.date(2020, 3, 24), 'Raport'), 
(datetime.date(2020, 3, 23), 'Raport'),

(datetime.date(2020, 3, 25), 'Document'), 
(datetime.date(2020, 3, 24), 'Document'), 
(datetime.date(2020, 3, 23), 'Document'),

(datetime.date(2020, 3, 25), 'Analize'), 
(datetime.date(2020, 3, 24), 'Analize'), 
(datetime.date(2020, 3, 23), 'Analize'),
]

Вот django (2.2) код:

sorted(DataSet.objects.values_list('doc_type', flat=True).distinct(), reverse=True)

Мне нужно получить последний и уникальный элемент каждого документа doc_type вместе с датой. На данный момент у меня есть тот же список документов:

['Raport', 'Document', 'Analize']

, но мне нужно:

[(datetime.date(2020, 3, 25), 'Raport'), (datetime.date(2020, 3, 25), 'Document'), (datetime.date(2020, 3, 25), 'Analize')]

Может кто-нибудь дать мне подсказку? Спасибо.

1 Ответ

1 голос
/ 26 марта 2020

Если решение Python соответствует вашим потребностям, используйте словарь для группировки и найдите максимальное значение:

import datetime

data = [
    (datetime.date(2020, 3, 25), 'Raport'),
    (datetime.date(2020, 3, 24), 'Raport'),
    (datetime.date(2020, 3, 23), 'Raport'),

    (datetime.date(2020, 3, 25), 'Document'),
    (datetime.date(2020, 3, 24), 'Document'),
    (datetime.date(2020, 3, 23), 'Document'),

    (datetime.date(2020, 3, 25), 'Analize'),
    (datetime.date(2020, 3, 24), 'Analize'),
    (datetime.date(2020, 3, 23), 'Analize'),
]

groups = {}

for date, group in data:
    if group not in groups:
        groups[group] = date
    elif date > groups[group]:
        groups[group] = date


result = [(v, k) for k, v in groups.items()]

print(result)

Вывод

[(datetime.date(2020, 3, 25), 'Raport'), (datetime.date(2020, 3, 25), 'Document'), (datetime.date(2020, 3, 25), 'Analize')]

Это решение имеет O(n) сложность времени.

...