Определите словари, если одно из значений совпадает в списке словарей в Python

#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) 
 

Сначала я извлекаю все различные значения «имени», сохраненные в выводе до сих пор, а затем проверяю, существует ли в нем текущее » имя » или нет.