У меня есть список диктов, где иногда есть дубликаты диктовок. Например:
objList =
[{
'Name': 'plate',
'StartTime': '2022-05-17T10:26:05.738101',
}, {
'Name': 'bezel',
'StartTime': '2022-05-17T10:26:09.922667',
}, {
'Name': 'chrome',
'StartTime': '2022-05-17T10:26:23.283304',
}, {
'Name': 'plate placement',
'StartTime': '2022-05-17T10:26:25.570845',
}, {
'Name': 'plate placement',
'StartTime': '2022-05-17T10:26:39.3390',
}]
В приведенных выше данных plate placement
дублируется. Точно так же любой dict может быть продублирован, но я должен удалить любые повторяющиеся данные и просто сохранить один. Для этого я сначала подумал проверить, есть ли у нас в списке дубликаты диктов или нет:
obj_names = []
for obj in objList:
obj_names.append(obj['Name'])
Теперь obj_names
содержит ['plate', 'bezel', 'chrome', 'plate placement', 'plate placement']
. Таким образом, мы знаем, какой dict дублируется. Теперь нам нужно удалить любое из его вхождений. Но я не уверен, как мы можем удалить это вхождение из списка. Кто-нибудь может предложить что-нибудь? Спасибо
Вместо списка словарей вы можете использовать словарь словарей, используя имя в качестве ключа. Таким образом, если вы вставите новый объект с тем же именем, он заменит предыдущий объект.
Если вам нужно сохранить порядок, вы можете использовать OrderedDict.
Как сказал @mugiseyebrows, мы используем 'Name'
каждого словаря (это утверждение не очень строгое) в качестве ключа и сам словарь в качестве значения для создания нового словаря, чтобы вы могли гарантировать, что словарь с тем же 'Name'
появится один раз. , а затем используйте его values
, чтобы создать новый список:
>>> new_dict = {dct['Name']: dct for dct in objList}
>>> new_list = list(new_dict.values())
>>> print('},\n'.join(str(new_list).split('},')))
[{'Name': 'plate', 'StartTime': '2022-05-17T10:26:05.738101'},
{'Name': 'bezel', 'StartTime': '2022-05-17T10:26:09.922667'},
{'Name': 'chrome', 'StartTime': '2022-05-17T10:26:23.283304'},
{'Name': 'plate placement', 'StartTime': '2022-05-17T10:26:39.3390'}]
@MechanicPig Не могли бы вы объяснить это в ответе?