Python 求助一个列表里有很多字典,怎么合并相同键生成一个新的列表?

data = [
    {'售后编号': '123', '订单编号': '1234', '商家编码': '商品A', '退款数量': 1, '卖家备注': '', '物流单号': '789789',
     '超时时间': '', '退款类型': '', '退款金额': ''},
    {'售后编号': '212', '订单编号': '1234', '商家编码': '商品B', '退款数量': 1, '卖家备注': '', '物流单号': '789789',
     '超时时间': '', '退款类型': '', '退款金额': ''},
    {'售后编号': '321', '订单编号': '1234', '商家编码': '商品C', '退款数量': 1, '卖家备注': '', '物流单号': '987987',
     '超时时间': '', '退款类型': '', '退款金额': ''},
    {'售后编号': '578', '订单编号': '4321', '商家编码': '商品D', '退款数量': 1, '卖家备注': '', '物流单号': '897897',
     '超时时间': '', '退款类型': '', '退款金额': ''}
]

result = [
    {'订单编号': '1234', '卖家备注': '',
     '789789': [{'售后编号': '123', '商家编码': '商品A', '超时时间': '', '退款类型': '', '退款金额': ''},
                {'售后编号': '212', '商家编码': '商品B', '超时时间': '', '退款类型': '', '退款金额': ''}],
     '987987': [{'售后编号': '321', '商家编码': '商品C', '超时时间': '', '退款类型': '', '退款金额': ''}]

     },
    {'订单编号': '4321', '卖家备注': '',
     '897897': [{'售后编号': '578', '商家编码': '商品D', '超时时间': '', '退款类型': '', '退款金额': ''}]
     }
]

如举例代码所示,data 是原始数据, result 是我想要的数据结构

大致就是一个订单里面 只有一个订单编号,一个备注内容,但是可以有很多商品,每个商品有对应的属性,效果就是把订单编号相同的数据合并,然后以物流单号为键去查找,如果物流单号相同则合并

阅读 2.2k
1 个回答

def group_by_order(data: list) -> dict:
    orders_info = dict()
    for d in data:
        order_id = d['订单编号']
        if order_id not in orders_info:
            orders_info[order_id] = list()
        orders_info[order_id].append(d)
    return orders_info


def gen_result(orders_info: dict) -> list:
    result = []
    for oi in orders_info:
        os = orders_info[oi]
        r = dict()
        for i, o in enumerate(os):
            if i == 0:
                r['订单编号'] = o['订单编号']
            sno = o['物流单号']
            if sno not in r:
                r[sno] = list()
            r[sno].append({'售后编号': o['售后编号']})
        result.append(r)
    return result


def main():
    print(gen_result(group_by_order(data)))


if __name__ == '__main__':
    main()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题