Как удалить дубли в массиве со словарями Python?
Необходимо удалить дубликаты по ключу значению name из массива со словарями.
Пробовал следующее:
def remove_duplicates(list):
seen = set()
new_list = []
for item in list:
t = tuple(item.items())
if t not in seen:
seen.add(t)
new_list.append(item)
return new_list
input = [{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}, \
{'description': 'First service another description', 'name': 'service_one', 'value': 'invalid.url'}, \
{'description': 'URL Service', 'name': 'service_one', 'value': 'invalid.url'}, \
{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}]
output = remove_duplicates(input)
print(output)
Получаю:
[{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}, \
{'description': 'First service another description', 'name': 'service_one', 'value': 'invalid.url'}, \
{'description': 'URL Service', 'name': 'service_one', 'value': 'invalid.url'}]
Ожидаю получить уникальные словари по элементу name(остальные поля не так важны):
{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}, \
{'description': 'First service another description', 'name': 'service_one', 'value': 'invalid.url'}
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Вам нужно в ваш сет отправлять не все элементы
а только name
t = tuple(item.name)
, не знаю Pyton но думаю как-то так
Автор решения: Эникейщик
→ Ссылка
Вы хотите сравнивать только "name", но сравниваете абсолютно все. Проверяйте только на повтор "name" и все будет хорошо:
def remove_duplicates(lst):
seen = set()
new_list = []
for item in lst:
item_name = item['name']
if item_name not in seen:
seen.add(item_name)
new_list.append(item)
return new_list