列表内相同值字典合并

新手上路,请多包涵

题目

原数据是以下列表,每个元素是一个字典,key是一样的。
li=[{'sw': '44','port': 1}, {'sw': '44', 'port': 2}, {'sw': '45', 'port': 21}, {'sw': '45', 'port': 22}, {'sw': '46', 'port': 2}]

期待的结果

要求是把key为‘sw’的值相同的字典合并成一个,port变为列表[1, 2]

[{'sw': '44','port': [1, 2]}, {'sw': '45', 'port': [21, 22]},{'sw': '46', 'port': [2]}]

阅读 1.3k
1 个回答

没想到什么一步到位的好方法,建个字典统计不同的sw的port,再遍历字典得到最终目标数组。

def transform(list):
    result = {}

    for item in list:
        result.setdefault(item['sw'], []).append(item['port'])

    return [{'sw': key, 'port': value} for key, value in result.items()]

Update: 支持任意多的key。
其实也没啥特别的,就是再遍历一遍把除主键之外的key都加到字典,核心思想都是一样的。

def transform(list, primary_key):
    result = {}
    keys = [key for key in list[0].keys() if key != primary_key]

    for item in list:
        target = result.setdefault(item[primary_key], {key: set() for key in keys})
        for key in keys:
            target[key].add(item[key])

    return [
        {
            primary_key: key,
        }
        | {k: [*v] for k, v in value.items()}
        for key, value in result.items()
    ]

list = [
    {"sw": "44", "loc": "G1", "port": 1},
    {"sw": "44", "loc": "G1", "port": 2},
    {"sw": "45", "loc": "G2", "port": 21},
    {"sw": "45", "loc": "G2", "port": 22},
    {"sw": "46", "loc": "G3", "port": 2},
]

print(transform(list, "sw"))
# => [{'sw': '44', 'loc': ['G1'], 'port': [1, 2]}, {'sw': '45', 'loc': ['G2'], 'port': [21, 22]}, {'sw': '46', 'loc': ['G3'], 'port': [2]}]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题