如何使用 python 代码根据指定条件合并列表中的字典
How to merge dictionaries in list according to specify condition using python code
我在堆栈中有一些开关。这个stack只有一个IP,但是有好几个switch,所以我需要在dict中收集IP addr和这个stac的所有switch ID。
我有一个包含听写的列表:
list = [
{'id': '107', 'name': sw1, 'ip': '10.10.10.5', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '352', 'name': sw2, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '125', 'name': sw3, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '90', 'name': sw4, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '148', 'name': sw5, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '45', 'name': sw6, 'ip': 'None', 'stack_id': 'sw6', 'manufcturer': 'cisco'} ]
我需要比较键 stack_id,如果这个键的值在这个字典中相等,那么需要创建嵌套字典,如下所示:
list2 = [
{dev1 : {'ip': '10.10.10.5', 'id1': '107' 'id2': '352', 'id3': '125', 'id4': '90', 'id5': '148'}}
, {'id': '45', 'name': sw6, 'ip': 'None', 'stack_id': 'sw6', 'manufcturer': 'cisco'}
, ...
]
请帮忙。我是 python 的新手,没有找到针对此任务的类似解决方案。
谢谢!
在我的建议下,还有一点小意见,永远不要在代码中使用 list 关键字,因为它会在意想不到的地方破坏代码:)
l = [
{'id': '107', 'name': "sw1", 'ip': '10.10.10.5', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '352', 'name': "sw2", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '125', 'name': "sw3", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '90', 'name': "sw4", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '148', 'name': "sw5", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '45', 'name': "sw6", 'ip': 'None', 'stack_id': 'sw6', 'manufcturer': 'cisco'} ]
from pprint import pprint
tmp = dict()
for i in l:
tmp.setdefault(i["stack_id"],[])
tmp[i["stack_id"]].append(i)
pprint(tmp)
结果:
{'sw1': [{'id': '107',
'ip': '10.10.10.5',
'manufcturer': 'cisco',
'name': 'sw1',
'stack_id': 'sw1'},
{'id': '352',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw2',
'stack_id': 'sw1'},
{'id': '125',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw3',
'stack_id': 'sw1'},
{'id': '90',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw4',
'stack_id': 'sw1'},
{'id': '148',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw5',
'stack_id': 'sw1'}],
'sw6': [{'id': '45',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw6',
'stack_id': 'sw6'}]}
我在堆栈中有一些开关。这个stack只有一个IP,但是有好几个switch,所以我需要在dict中收集IP addr和这个stac的所有switch ID。
我有一个包含听写的列表:
list = [
{'id': '107', 'name': sw1, 'ip': '10.10.10.5', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '352', 'name': sw2, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '125', 'name': sw3, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '90', 'name': sw4, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '148', 'name': sw5, 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '45', 'name': sw6, 'ip': 'None', 'stack_id': 'sw6', 'manufcturer': 'cisco'} ]
我需要比较键 stack_id,如果这个键的值在这个字典中相等,那么需要创建嵌套字典,如下所示:
list2 = [
{dev1 : {'ip': '10.10.10.5', 'id1': '107' 'id2': '352', 'id3': '125', 'id4': '90', 'id5': '148'}}
, {'id': '45', 'name': sw6, 'ip': 'None', 'stack_id': 'sw6', 'manufcturer': 'cisco'}
, ...
]
请帮忙。我是 python 的新手,没有找到针对此任务的类似解决方案。 谢谢!
在我的建议下,还有一点小意见,永远不要在代码中使用 list 关键字,因为它会在意想不到的地方破坏代码:)
l = [
{'id': '107', 'name': "sw1", 'ip': '10.10.10.5', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '352', 'name': "sw2", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '125', 'name': "sw3", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '90', 'name': "sw4", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '148', 'name': "sw5", 'ip': 'None', 'stack_id': 'sw1', 'manufcturer': 'cisco'},
{'id': '45', 'name': "sw6", 'ip': 'None', 'stack_id': 'sw6', 'manufcturer': 'cisco'} ]
from pprint import pprint
tmp = dict()
for i in l:
tmp.setdefault(i["stack_id"],[])
tmp[i["stack_id"]].append(i)
pprint(tmp)
结果:
{'sw1': [{'id': '107',
'ip': '10.10.10.5',
'manufcturer': 'cisco',
'name': 'sw1',
'stack_id': 'sw1'},
{'id': '352',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw2',
'stack_id': 'sw1'},
{'id': '125',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw3',
'stack_id': 'sw1'},
{'id': '90',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw4',
'stack_id': 'sw1'},
{'id': '148',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw5',
'stack_id': 'sw1'}],
'sw6': [{'id': '45',
'ip': 'None',
'manufcturer': 'cisco',
'name': 'sw6',
'stack_id': 'sw6'}]}