#python #list #dictionary
Вопрос:
В моем текущем списке диктов все словари содержат разные значения, кроме «имя»:
list_dicts = [{'id': 12345, 'name': 'Bobby Bobs', 'pets': ['cat']},
{'id': 678910, 'name': 'Bobby Bobs', 'pets': ['zebra']},
{'id': 111213, 'name': 'Lisa Bobs', 'pets': ['horse']},
{'id': 141516, 'name': 'Lisa Bobs', 'pets': ['rabbit']}]
Я хотел бы создать новый список словарей, в котором существует только один из словарей с повторяющимися именами.
Желаемый результат:
output_list_dicst = [{'id': 12345, 'name': 'Bobby Bobs', 'pets': ['cat']},
{'id': 111213, 'name': 'Lisa Bobs', 'pets': ['horse']}]
Текущий код: Я попытался создать новый список диктов, если d[‘имя’] там не существует.
output = []
for d in list_dicts:
if d['name'] not in output: #if the name value is not existing (yet), append d to output
output.append(d)
Это не работает, но я думаю, что я думаю в правильном направлении.
Ответ №1:
Да, направление правильное, просто вы проверяли строку (имя), но добавляли объекты в список. Вместо этого вам понадобится что-то, где вы добавляете имена и объекты попарно, чтобы вы могли проверить наличие имени. Как диктант:
list_dicts = [{'id': 12345, 'name': 'Bobby Bobs', 'pets': ['cat']},
{'id': 678910, 'name': 'Bobby Bobs', 'pets': ['zebra']},
{'id': 111213, 'name': 'Lisa Bobs', 'pets': ['horse']},
{'id': 141516, 'name': 'Lisa Bobs', 'pets': ['rabbit']}]
output = {}
for d in list_dicts:
if d['name'] not in output:
output[d['name']]=d
print(output)
затем у вас есть диктант, и вы можете получить его значения, чтобы получить отфильтрованный список, который вы хотели:
actuallist=list(output.values())
print(actuallist)
Ответ №2:
Вы почти правы, проблема в том, что вы проверяете , есть ли имя output
, но вы добавляете диктанты в вывод. Сделайте это вместо этого:
known_name = set()
[known_name.add(dct["name"]) or dct
for dct in list_dicts
if dct["name"] not in known_name]
known_name
просто собирает имена, чтобы мы могли отслеживать их. Тогда в списке понимания сохраняются только новые диктанты. known_name.add(dct["name"])
добавляет имя в список известных имен и возвращает None
, поэтому known_name.add(dct["name"]) or dct
добавляет к known_name, но в конечном итоге оценивает до dct
.
Ответ №3:
output = []
for d in list_dicts:
t = [temp_dict['name'] for temp_dict in output]
if d['name'] not in t:
output.append(d)
Сначала я извлекаю все различные значения «имени», сохраненные в выводе до сих пор, а затем проверяю, существует ли в нем текущее » имя » или нет.