Если dicts будут в отсортированном порядке на основе ключа 'remote'
, вы можете сгруппировать их с помощью ключа 'remote'
и получить последнюю запись, которая будет последняя метка времени.
l = [{'remote': '1', 'quantity': 1.0, 'timestamp': 1},
{'remote': '2', 'quantity': 1.0, 'timestamp': 2},
{'remote': '2', 'quantity': 1.0, 'timestamp': 3}]
from itertools import groupby
from operator import itemgetter
l[:] = (list(v)[-1] for _, v in groupby(l,key=(itemgetter("remote"))))
print(l)
[{'timestamp': 1, 'remote': '1', 'quantity': 1.0},
{'timestamp': 3, 'remote': '2', 'quantity': 1.0}]
l[:]
изменяет первоначальный список, (list(v)[-1] for k,v in groupby(l,key=(itemgetter("remote"))))
это выражение генератор, который означает, что мы не должны хранить все содержимое памяти сразу которое, если память также вопрос поможет.
Это также будет работать для неупорядоченных данных после того, как обманутые всегда вместе и последняя боян приходит последним:
l = [{'remote': '1', 'quantity': 1.0, 'timestamp': 1},
{'remote': '4', 'quantity': 1.0, 'timestamp': 1},
{'remote': '2', 'quantity': 1.0, 'timestamp': 2},
{'remote': '2', 'quantity': 1.0, 'timestamp': 3}]
l[:] = (list(v)[-1] for k,v in groupby(l, key=(itemgetter("remote"))))
print(l)
[{'timestamp': 1, 'remote': '1', 'quantity': 1.0}, {'timestamp': 1, 'remote': '4', 'quantity': 1.0}, {'timestamp': 3, 'remote': '2', 'quantity': 1.0}]
Или, если обманутые не отсортирован получить максимально на основе временной метки:
l = [{'remote': '1', 'quantity': 1.0, 'timestamp': 1},
{'remote': '4', 'quantity': 1.0, 'timestamp': 1},
{'remote': '2', 'quantity': 1.0, 'timestamp': 3},
{'remote': '2', 'quantity': 1.0, 'timestamp': 2}]
l[:] = (max(v,key=itemgetter("timestamp")) for _, v in groupby(l, key=(itemgetter("remote")))
[{'timestamp': 1, 'remote': '1', 'quantity': 1.0}, {'timestamp': 1, 'remote': '4', 'quantity': 1.0}, {'timestamp': 3, 'remote': '2', 'quantity': 1.0}]
Если вы собираетесь сортировать, вы должны сделать обратную сортировку на месте с помощью ключа дистанционного управления, после чего они будут звонить по следующей группе: v
, чтобы получить последние:
l = [{'remote': '1', 'quantity': 1.0, 'timestamp': 1},
{'remote': '4', 'quantity': 1.0, 'timestamp': 1},
{'remote': '2', 'quantity': 1.0, 'timestamp': 3},
{'remote': '2', 'quantity': 1.0, 'timestamp': 2}]
l.sort(key=itemgetter("remote"),reverse=True)
l[:] = (next(v) for _, v in groupby(l, key=(itemgetter("remote"))))
print(l)
Сортировка изменяет порядок диктонов, хотя это может оказаться неприемлемым для вашей проблемы, если ваш dicts
соответствует вашему вводу, тогда вам не нужно беспокоиться о сортировке в любом случае.
Может ли вы добавить свой ожидаются из положить и ваш код, который вы пробовали до сих пор? – Kasramvd
являются ключами в каждом dict и являются диктофонами в отсортированном порядке? –