如何使用 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'}]}