#python #list #dictionary #duplicates
#python #Список #словарь #дубликаты
Вопрос:
details = [
{"id": "1", "name": "Bob", "age": 21, "student" : "yes"},
{"id": "1", "name": "Mary", "age": 25, "student" : "yes"},
{"id": "2", "name": "Jeff", "age": 22, "student" : "no"}
]
Ожидаемый:
[{"id": "2", "name": "Jeff", "age": 22, "student" : "no"}]
Я попробовал решение для удаления дубликатов, но в этих методах id = 1 и 2 остаются уникальными значениями, но мне нужно, если идентификатор повторяется, удалить обе или несколько совпадающих пар вместе со своим словарем и оставить только ту, которая не повторяется. Любая помощь, пожалуйста.
Комментарии:
1. все повторяющиеся значения для ключа «id» должны быть удалены
2. В a нет «первого» ключа
dict
; если вы не используете anOrderedDict
.
Ответ №1:
Вы можете сохранить a list
для проверки множественного вхождения an id
, затем вы можете игнорировать эту запись
details = [
{"id": "1", "name": "Bob", "age": 21, "student" : "yes"},
{"id": "1", "name": "Mary", "age": 25, "student" : "yes"},
{"id": "2", "name": "Jeff", "age": 22, "student" : "no"}
]
ids = []
to_be_deleted = []
for i in details:
if i['id'] in ids:
to_be_deleted.append(i['id'])
else:
ids.append(i['id'])
output = [i for i in details if i['id'] not in to_be_deleted]
print(output)
[{'id': '2', 'name': 'Jeff', 'age': 22, 'student': 'no'}]
Комментарии:
1. Вы можете использовать только один из
ids/to_be_deleted
, и превращение его вset
значительно повысит производительность, если в списке много dicts
Ответ №2:
Использование коллекций.Счетчик для получения ids
появляется только один раз.
from collections import Counter
details = [
{"id": "1", "name": "Bob", "age": 21, "student" : "yes"},
{"id": "1", "name": "Mary", "age": 25, "student" : "yes"},
{"id": "2", "name": "Jeff", "age": 22, "student" : "no"}
]
c = Counter(map(lambda x: x['id'], details))
details = list(filter(lambda x: c[x['id']] == 1, details))
print(details)
С принтами:
[{'id': '2', 'name': 'Jeff', 'age': 22, 'student': 'no'}]