You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:合并具有相同TransactionId的字典列表

合并相同TransactionId的字典列表

我有如下格式的字典列表:

import numpy as np

transactions = [
    {'Transaction_Date': '23/02/22', 'Particulars': 'UPI-RAJESHKUMAR KANOJIA-O112254823B@MAIR', 'Cheque Number': '205482165529', 'ValueDate': '23/02/22', 'Debit': '189', 'Credit': np.nan, 'Balance': 1939.24, 'IsTransactionStart': True, 'TransactionId': 1}, 
    {'Transaction_Date': np.nan, 'Particulars': 'TEL-AIRP0000001-205482165529-PAYMENT MAD', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 1}, 
    {'Transaction_Date': np.nan, 'Particulars': 'E TO ME', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 1}, 
    {'Transaction_Date': '24/02/22', 'Particulars': 'UPI-ADD MONEY TO WALLET-ADD-MONEY@PAYTM-', 'Cheque Number': '205599473326', 'ValueDate': '24/02/22', 'Debit': '602', 'Credit': np.nan, 'Balance': 1337.24, 'IsTransactionStart': True, 'TransactionId': 2}, 
    {'Transaction_Date': np.nan, 'Particulars': 'PYTM0123456-205599473326-NA', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 2}, 
    {'Transaction_Date': '24/02/22', 'Particulars': '.ACH DEBIT RETURN CHARGES 020222 020222-', 'Cheque Number': 'MIR2205429451991', 'ValueDate': '24/02/22', 'Debit': '531', 'Credit': np.nan, 'Balance': 806.24, 'IsTransactionStart': True, 'TransactionId': 3}, 
    {'Transaction_Date': np.nan, 'Particulars': 'MIR2205429451991', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 3}
]

希望合并所有具有相同TransactionId的字典,得到如下结果:

[
    {'Transaction_Date': '23/02/22', 'Particulars': 'UPI-RAJESHKUMAR KANOJIA-O112254823B@MAIR TEL-AIRP0000001-205482165529-PAYMENT MAD E TO ME', 'Cheque Number': '205482165529', 'ValueDate': '23/02/22', 'Debit': '189', 'Credit': np.nan, 'Balance': 1939.24, 'IsTransactionStart': True, 'TransactionId': 1}, 
    {'Transaction_Date': '24/02/22', 'Particulars': 'UPI-ADD MONEY TO WALLET-ADD-MONEY@PAYTM-PYTM0123456-205599473326-NA', 'Cheque Number': '205599473326', 'ValueDate': '24/02/22', 'Debit': '602', 'Credit': np.nan, 'Balance': 1337.24, 'IsTransactionStart': True, 'TransactionId': 2}, 
    {'Transaction_Date': '24/02/22', 'Particulars': '.ACH DEBIT RETURN CHARGES 020222 020222-MIR2205429451991', 'Cheque Number': 'MIR2205429451991', 'ValueDate': '24/02/22', 'Debit': '531', 'Credit': np.nan, 'Balance': 806.24, 'IsTransactionStart': True, 'TransactionId': 3}
]

解决方案

可以通过Python实现分组合并,以下是完整代码和逻辑说明:

代码实现

import numpy as np
from collections import defaultdict

def merge_transactions(transactions):
    # 按TransactionId分组,将同ID的交易字典归为一组
    grouped_trans = defaultdict(list)
    for trans in transactions:
        grouped_trans[trans['TransactionId']].append(trans)
    
    merged_result = []
    # 遍历每个分组完成合并
    for _, trans_group in grouped_trans.items():
        merged_trans = {}
        
        # 合并Particulars字段:收集所有非空的备注内容并拼接
        particulars_content = []
        for trans in trans_group:
            part = trans['Particulars']
            if part is not np.nan:
                particulars_content.append(part.strip())
        merged_trans['Particulars'] = ' '.join(particulars_content)
        
        # 处理其他字段:取分组内第一个非空的值
        for key in trans_group[0].keys():
            if key == 'Particulars':
                continue
            # 查找该字段的第一个非空值
            for trans in trans_group:
                val = trans[key]
                if val is not np.nan:
                    merged_trans[key] = val
                    break
            # 若所有值都是空,则保留nan
            if key not in merged_trans:
                merged_trans[key] = np.nan
        
        merged_result.append(merged_trans)
    return merged_result

# 测试运行
if __name__ == "__main__":
    transactions = [
        {'Transaction_Date': '23/02/22', 'Particulars': 'UPI-RAJESHKUMAR KANOJIA-O112254823B@MAIR', 'Cheque Number': '205482165529', 'ValueDate': '23/02/22', 'Debit': '189', 'Credit': np.nan, 'Balance': 1939.24, 'IsTransactionStart': True, 'TransactionId': 1}, 
        {'Transaction_Date': np.nan, 'Particulars': 'TEL-AIRP0000001-205482165529-PAYMENT MAD', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 1}, 
        {'Transaction_Date': np.nan, 'Particulars': 'E TO ME', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 1}, 
        {'Transaction_Date': '24/02/22', 'Particulars': 'UPI-ADD MONEY TO WALLET-ADD-MONEY@PAYTM-', 'Cheque Number': '205599473326', 'ValueDate': '24/02/22', 'Debit': '602', 'Credit': np.nan, 'Balance': 1337.24, 'IsTransactionStart': True, 'TransactionId': 2}, 
        {'Transaction_Date': np.nan, 'Particulars': 'PYTM0123456-205599473326-NA', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 2}, 
        {'Transaction_Date': '24/02/22', 'Particulars': '.ACH DEBIT RETURN CHARGES 020222 020222-', 'Cheque Number': 'MIR2205429451991', 'ValueDate': '24/02/22', 'Debit': '531', 'Credit': np.nan, 'Balance': 806.24, 'IsTransactionStart': True, 'TransactionId': 3}, 
        {'Transaction_Date': np.nan, 'Particulars': 'MIR2205429451991', 'Cheque Number': np.nan, 'ValueDate': np.nan, 'Debit': np.nan, 'Credit': np.nan, 'Balance': np.nan, 'IsTransactionStart': False, 'TransactionId': 3}
    ]
    
    final_result = merge_transactions(transactions)
    for item in final_result:
        print(item)

合并逻辑说明

  • 分组归类:用defaultdict把交易按TransactionId分组,确保同ID的交易放在一起
  • 备注拼接:把每个分组里所有非空的Particulars内容收集起来,拼成完整的备注字符串
  • 字段填充:对于日期、金额、支票号等字段,直接取分组里第一个非空的值——因为原始数据中只有标记IsTransactionStart: True的交易有有效数据,其余都是补充备注的空字典
  • 结果整理:将每个分组合并后的字典加入最终列表,得到目标格式

内容的提问来源于stack exchange,提问作者donny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:20:35