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
相关产品推荐
相关产品推荐

