Создать список словарей с уникальными ключами из списка словарей с дублированными ключами - PullRequest
1 голос
/ 29 марта 2019

У меня есть список словарей:

records = [{id:123, name:'Course A', enrolled_date:'1st Feb'}, 
           {id:123, name:'Course A', enrolled_date:'1st Jan'},
           {id:456, name:'Course B', enrolled_date:'1st Jan'}]

Я хочу создать новый список словарей из этих данных.Новый список должен содержать только словари с ids уникальными в пределах этого списка, например:

new_records = [{id:123, name:'Course A'}, 
               {id:456, name:'Course B'}]

Это код, который я пробовал до сих пор.Это явно не работает - но я исчерпал все усилия, чтобы исправить это.

new_records = []

for record in records: 
    new_id = record['id']
    new_name = record['name'] 
    new_dict = {'id':new_id, 'name',new_name}
    If new_id not in new_records:
        new_records.append(new_dict)

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Это основано на коде, который вы предоставили, но он работает очень медленно для большого списка, как отмечено в других комментариях.

new_records = []

for record in records: 
    new_id = record['id'] 
    new_name = record['name'] 
    new_dict = {'id':new_id, 'name': new_name}
    if not any(new_record['id'] == new_id for new_record in new_records):
        new_records.append(new_dict)
1 голос
/ 29 марта 2019

Вы также можете сделать это, отфильтровав массив, используя набор уже «увиденных» записей:

records = [{"id":123, "name":'Course A', "enrolled_date":'1st Feb'}, 
           {"id":123, "name":'Course A', "enrolled_date":'1st Jan'},
           {"id":456, "name":'Course B', "enrolled_date":'1st Jan'}]

seen     = set()
new_dict = [d for d in records if not(d['id'] in seen or seen.add(d['id']))]

# {'id': 123, 'name': 'Course A', 'enrolled_date': '1st Feb'}
# {'id': 456, 'name': 'Course B', 'enrolled_date': '1st Jan'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...