Удалить оба элемента из списка словарей, если значение 1-го ключа совпадает

#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 ; если вы не используете an OrderedDict .

Ответ №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'}]