Как обновить значение в списке из словарей 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 шт):
Возможно, существует более элегантный вариант решения.
# 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'
Все достаточно просто. Получаем номера дубликатов, после чего проходимся по исходному списку. Если значение дубликата номера совпало, то обновляем словарь через 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