Удаление дубликатов в списке словаря в зависимости от критериев

#python #dictionary #duplicates

Вопрос:

Я нашел только вопросы, в которых люди хотели удалить дубликаты, но не в зависимости от критериев, которые включают значение ключей.

Допустим, у меня есть список, содержащий словари

 myList = [
  {'version': 'v1', 'updated': '2020-06-17 22:15:00 00:00'},
  {'version': 'v1', 'updated': '2020-08-24 17:37:00 00:00'},
  {'version': 'v5', 'updated': '2019-08-30 11:42:00 00:00'},
  {'version': 'v1', 'updated': '2020-03-11 22:28:00 00:00'},
  {'version': 'v7', 'updated': '2020-06-17 22:15:00 00:00'}
]
 

теперь я хочу удалить дубликаты словарей, в которых ключи имеют одинаковое значение, например, version имеют значение v1 и сохраняют только самое последнее, но я не знаю, какое значение v1 , поэтому я должен проверять наличие дубликатов, version не зная значения. После поиска дубликатов я хочу сравнить дату update , выбрать последнюю и удалить дубликаты в соответствии с этим критерием. Я не могу гарантировать, что последняя запись является последней, как это видно из myList того, что вторая запись v1 является последней, а не третьей.

В результате чего

 myCleanedList= [
  {'version': 'v1', 'updated': '2020-08-24 17:37:00 00:00'},
  {'version': 'v5', 'updated': '2019-08-30 11:42:00 00:00'},
  {'version': 'v7', 'updated': '2020-06-17 22:15:00 00:00'}
]
 

Ответ №1:

Попробуй:

 myList = [
    {"version": "v1", "updated": "2020-06-17 22:15:00 00:00"},
    {"version": "v1", "updated": "2020-08-24 17:37:00 00:00"},
    {"version": "v5", "updated": "2019-08-30 11:42:00 00:00"},
    {"version": "v1", "updated": "2020-03-11 22:28:00 00:00"},
    {"version": "v7", "updated": "2020-06-17 22:15:00 00:00"},
]

out = {}
for d in myList:
    out.setdefault(d["version"], []).append(d)

out = [
    sorted(v, key=lambda k: k["updated"], reverse=True)[0] for v in out.values()
]
print(out)
 

С принтами:

 [{'version': 'v1', 'updated': '2020-08-24 17:37:00 00:00'}, 
 {'version': 'v5', 'updated': '2019-08-30 11:42:00 00:00'}, 
 {'version': 'v7', 'updated': '2020-06-17 22:15:00 00:00'}]
 

Комментарии:

1. Работает нормально, но что, если у меня разные ключи и одно и то же значение? например, myList = [ {"version": "v1", "updated": "2020-06-17 22:15:00 00:00"}, {"versioning": "v1", "updated": "2020-08-24 17:37:00 00:00"}, {"version": "v5", "updated": "2019-08-30 11:42:00 00:00"}, {"version": "v1", "updated": "2020-03-11 22:28:00 00:00"}, {"version": "v7", "updated": "2020-06-17 22:15:00 00:00"}, ] есть ли еще способ найти дубликаты version И versioning объединить их, чтобы получить тот же результат, что и раньше, и сохранить ключ version ?

Ответ №2:

Код с всегда отсортированной «версией» в любом порядке ввода:
(порядок ввода был изменен на «версия» 1-7-5 вместо исходного 1-5-7)

 myList = [
    {'version': 'v1', 'updated': '2020-06-17 22:15:00 00:00'},
    {'version': 'v7', 'updated': '2020-06-17 22:15:00 00:00'},
    {'version': 'v1', 'updated': '2020-08-24 17:37:00 00:00'},
    {'version': 'v5', 'updated': '2019-08-30 11:42:00 00:00'},
    {'version': 'v1', 'updated': '2020-03-11 22:28:00 00:00'}
]

out = {d["version"]: d for d in sorted(myList, key=lambda k: k["updated"])}
print(*sorted(out.values(), key=lambda k: k["version"]), sep='n')
 

Выход:

 {'version': 'v1', 'updated': '2020-08-24 17:37:00 00:00'}
{'version': 'v5', 'updated': '2019-08-30 11:42:00 00:00'}
{'version': 'v7', 'updated': '2020-06-17 22:15:00 00:00'}