寻找修改字典的有效方法

我有以下格式的词典列表:

>>> 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}]}

关于python - 修改字典列表的Python方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56372010/

10-14 17:38
查看更多