Как обновить значение в списке из словарей c 'No' на 'Yes'

Имеется список словарей. Примерно такой:

p_list = [
         {'fio': 'Петров Иван', 'number': 1900, 'status': 'No'},
         {'fio': 'Петров Александр', 'number': 1900, 'status': 'No'},
         {'fio': 'Шпак Игорь', 'number': 2002, 'status': 'No'},
         ]

data_list = []
for tel in p_list:
    data_list.append(tel['number'])
#нашел дубликаты, 1900 это две записи.
duplicates = [item for item in set(data_list) if data_list.count(item) > 1]

Как мне у записей с дубликатами обновить 'status': 'No' на 'status': 'Yes'?


Ответы (2 шт):

Автор решения: OwlCodR

Возможно, существует более элегантный вариант решения.

# list ключей, по которым будет осуществляться поиск дубликатов
keys = ['fio', 'number']
for key in keys:
    values = [row[key] for row in p_list]
    for item in p_list:
        if values.count(item[key]) > 1:
            item['status'] = 'True'
→ Ссылка
Автор решения: Andy Pavlov

Все достаточно просто. Получаем номера дубликатов, после чего проходимся по исходному списку. Если значение дубликата номера совпало, то обновляем словарь через update().

p_list = [
         {'fio': 'Петров Иван', 'number': 1900, 'status': 'No'},
         {'fio': 'Петров Александр', 'number': 1900, 'status': 'No'},
         {'fio': 'Шпак Игорь', 'number': 2002, 'status': 'No'},
         ]

numbers = [p['number'] for p in p_list]
dubs = set(n for n in numbers if numbers.count(n) > 1)
for p in p_list:
    p.update({'status': 'Yes'}) if p['number'] in dubs else None

Либо еще более короткая запись, которая по идее должна и быстрее быть. Берем элемент списка для номера в котором проводим поиск по этому же списку. Я его реализовал через число появлений в виде sum([1 for c in p_list if c['number'] == p['number']]), которое для дубликатов больше 1. Тогда при выполнении условия обновляем элемент словаря.

for p in p_list:
    p.update({'status': 'Yes'}) if sum([1 for c in p_list if c['number'] == p['number']]) > 1 else None
→ Ссылка