#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'}