Я не совсем уверен, что понимаю весь вопрос, но мне кажется, что я получаю «самые последние предметы, но без идентичных предметов, появляющихся рядом друг с другом», поэтому я сосредоточусь на этой части.
Если вы можете разделить идентичные элементы, сохраняя порядок между ними, это довольно легко; сначала выполните сортировку по дате, а затем выполните разделение. Я не мог придумать существующую функцию, которая выполняет такое разделение, поэтому я взломал одну, которая работает «достаточно хорошо» для получения разумного результата:
from datetime import datetime
from typing import Any, Callable, List, Optional, TypeVar
_I = TypeVar('_I')
def declump(
items: List[_I],
key: Optional[Callable[[_I], Any]] = None
) -> None:
"""
Separate identical items by doing repeated swaps of the form:
AAB -> ABA (in-place)
Existing ordering is preserved within sets of identical items,
but not between non-identical items.
fixme: we can end up with a clump at the very end of the list!
Easy workaround is to reverse the list and declump again.
"""
if key is None:
key = lambda x: x
i = 0
key(items[i])
while i < len(items) - 2:
if (
key(items[i]) == key(items[i+1])
and key(items[i+1]) != key(items[i+2])
):
items[i+1], items[i+2] = items[i+2], items[i+1]
if i > 0:
i -= 1
continue
i += 1
produce = [
('Apple', '10/02/2020'),
('Apple', '15/02/2020'),
('Apple', '10/03/2020'),
('Apple', '15/03/2020'),
('Apple', '10/04/2020'),
('Apple', '15/04/2020'),
('Banana', '16/03/2020'),
('Banana', '21/03/2020'),
('Banana', '16/04/2020'),
('Orange', '13/03/2020'),
('Orange', '15/03/2020'),
]
produce.sort(key=lambda t: datetime.strptime(t[1], r'%d/%m/%Y'), reverse=True)
produce.reverse()
declump(produce, key=lambda t: t[0])
produce.reverse()
declump(produce, key=lambda t: t[0])
print('\n'.join(t[0].ljust(8) + t[1] for t in produce))
производит:
Apple 15/04/2020
Banana 16/04/2020
Apple 10/04/2020
Banana 21/03/2020
Apple 15/03/2020
Banana 16/03/2020
Apple 10/03/2020
Orange 15/03/2020
Apple 15/02/2020
Orange 13/03/2020
Apple 10/02/2020
Я почти уверен, что есть лучший способ написать эту declump
функцию, но куча ее переворачивания и повторного вызова, похоже, компенсирует ее недостатки, поэтому я оставлю улучшения в качестве упражнения для читателя.