Ищете эффективный способ изменить словарь
У меня есть список словарей в этом формате:
>>> x = [{'server': 's1', 'disk' : 'd1', 'size': 10},{'server': 's2', 'disk' : 'd2', 'size': 20},{'server': 's3', 'disk' : 'd3', 'size': 30}, {'server': 's1', 'disk' : 'd4', 'size': 40}]
Я бы хотел, чтобы он был реструктурирован, чтобы значение «сервер» стало ключом и содержало список словарей с информацией о диске и размере, которые находятся на этом сервере.
{'s1': [{'disk': 'd1', 'size': 10}, {'disk': 'd4', 'size': 40}], 's2': [{'disk': 'd2', 'size': 20}], 's3': [{'disk': 'd3', 'size': 30}]}
Это то, что я пробовал:
>>> y = {y[i.pop('server')].append(i) if i['server'] in y else i.pop('server'): [i] for i in x}
>>> y
{'s1': [{'disk': 'd4', 'size': 40}], 's2': [{'disk': 'd2', 'size': 20}], 's3': [{'disk': 'd3', 'size': 30}]}
>>> out = {'s1' : [{'disk' : 'd1', 'size': 10},{'disk' : 'd4', 'size': 40}], 's2' : [{'disk' : 'd2', 'size': 20}], 's3' : [{'disk' : 'd3', 'size': 30}]}
Ваш подход хорош, но я мог бы предложить создать новый словарь вместо изменения того, что у нас уже есть. Для этого вы можете перебрать список и создать необходимый словарь следующим образом.
x = [{'server': 's1', 'disk' : 'd1', 'size': 10},{'server': 's2', 'disk' : 'd2', 'size': 20},{'server': 's3', 'disk' : 'd3', 'size': 30}, {'server': 's1', 'disk' : 'd4', 'size': 40}]
from collections import defaultdict
dct = defaultdict(list)
#Iterate over the list
for item in x:
#Use server value as key, and the remainining k,v pairs as dict and append them to a list
dct[item['server']].append({k:v for k,v in item.items() if k != 'server'})
print(dict(dct))
Или, если вы хотите следовать подходу dict.pop()
, вставьте ключ server
и используйте его в качестве ключа в своем словаре.
x = [{'server': 's1', 'disk' : 'd1', 'size': 10},{'server': 's2', 'disk' : 'd2', 'size': 20},{'server': 's3', 'disk' : 'd3', 'size': 30}, {'server': 's1', 'disk' : 'd4', 'size': 40}]
from collections import defaultdict
dct = defaultdict(list)
#Iterate over the list
for item in x:
#Get server value after popping server key
server = item.pop('server')
#Use that value and append the remaining dict to a list
dct[server].append(item)
print(dict(dct))
Результат будет одинаковым в обоих случаях, т.е.
{'s1': [{'disk': 'd1', 'size': 10}, {'disk': 'd4', 'size': 40}], 's2': [{'disk': 'd2', 'size': 20}], 's3': [{'disk': 'd3', 'size': 30}]}