Объединить словари, если значение конкретного ключа одинаково - PullRequest
0 голосов
/ 30 октября 2018

Например, у меня есть список из четырех словарей, таких как

[{'username': 'xyz', 'label':'chemistry', 'marks': 56},
 {'username': 'abc', 'label':'chemistry', 'marks': 95},
 {'username': 'xyz', 'label':'math', 'marks': 43},
 {'username': 'abc', 'label':'math', 'marks': 87}]

Я хочу преобразовать данные, чтобы получить данные как

[{'username': 'xyz', 'chemistry': 56, 'math': 43},
 {'username': 'abc', 'chemistry': 95, 'math': 87}]

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Это немного многословно, но оно выполнит свою работу.

usersDict = {}
for item in listOfDicts:
    if (item['username'] in dict):
        usersDict[item['username']][item['label']] = item['marks']
    else:
        usersDict[item['username']] = { 
            'username': item['username']
            item['label']: item['marks'] 
        }
result = list(userDict.values())

Обратите внимание, что я здесь использую словарь, потому что поиск по словарю - O (1) вместо O (n) в списке.

0 голосов
/ 30 октября 2018

Использование collections.defaultdict:

from collections import defaultdict

L = [{'username': 'xyz', 'label':'chemistry', 'marks': 56},
     {'username': 'abc', 'label':'chemistry', 'marks': 95},
     {'username': 'xyz', 'label':'math', 'marks': 43},
     {'username': 'abc', 'label':'math', 'marks': 87}]

dd = defaultdict(lambda: defaultdict(int))

for i in L:
    dd[i['username']][i['label']] = i['marks']

res = [{'username': k, **v} for k, v in dd.items()]

[{'username': 'xyz', 'chemistry': 56, 'math': 43},
 {'username': 'abc', 'chemistry': 95, 'math': 87}]
0 голосов
/ 30 октября 2018

Вот однопроходное решение, использующее отображение dict для отслеживания записи в списке для каждого имени пользователя при добавлении (при условии, что ваш список dict хранится в переменной l):

m = []
d = {}
for i in l:
    u = i['username']
    if u not in d:
        m.append({'username': u})
        d[u] = m[-1]
    d[u][i['label']] = i['marks']

m станет:

[{'username': 'xyz', 'chemistry': 56, 'math': 43}, {'username': 'abc', 'chemistry': 95, 'math': 87}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...