Python如何复制字典填充随机值生成指定格式测试数据
问题分析
- 引用传递错误:你直接修改原字典
a中的嵌套字典和列表,Python中可变对象是引用传递,所有赋值操作最终都指向同一个内存地址,导致后续修改会覆盖之前已生成的所有数据。 - 追加内容错误:你判断accNum存在时,往列表里append的是
j[0]['accNum']字符串,不是需求要求的交易字典对象,完全不符合输出格式要求。 - 循环逻辑错误:外层while循环套
for j in a.values()遍历,但原字典a只有1个键值对,遍历逻辑冗余,计数规则也不符合生成多条数据的需求。
修复后的实现代码
import random import copy # 原始模板 template_a = { "6335050000000172": [ { "accBalance": 6, "accNum": 6335050000000172, "activityCode": 440, "activityDate": "2021-09-27 00:00:00", "creditsDebits": 0, "displayPostage": "", "meterSerialNumber": 0, "postage": 0, "timeZone": "", "transactionDescription": "PAYMENT THANK YOU" } ] } # 提取交易记录模板 trans_template = list(template_a.values())[0][0] times = ["2021-09-27 00:00:00", "2021-08-27 00:00:00","2021-07-27 00:00:00","2021-06-27 00:00:00","2021-05-27 00:00:00","2021-03-27 00:00:00"] acc_num_list = ["6335050000000172","6335052000143333","6335051000136685","6335052030050953","6335050000000313","6335052030050185"] transactionDescription = ['DIRECT DEBIT PAYMENT THANK YOU', 'METER REFILL', 'METER RESET', 'PAYMENT RECEIVED' ] result = {} # 可自行调整生成的总交易条数,这里示例生成20条 total_trans = 20 for _ in range(total_trans): # 深拷贝模板,生成全新的交易对象,避免引用覆盖问题 new_trans = copy.deepcopy(trans_template) # 填充随机值 new_trans['accBalance'] = random.randint(0,100) new_trans['transactionDescription'] = random.choice(transactionDescription) new_trans['accNum'] = random.choice(acc_num_list) new_trans['activityDate'] = random.choice(times) # 按accNum分类存入结果字典 acc_num_str = str(new_trans['accNum']) if acc_num_str in result: result[acc_num_str].append(new_trans) else: result[acc_num_str] = [new_trans] print(result) # 写入文件逻辑可自行保留
核心改动说明
- 提取了独立的交易记录模板,每次生成新交易时用
copy.deepcopy深拷贝模板,保证所有交易对象都是独立的,不会互相覆盖。 - 调整了分类逻辑,accNum存在时直接追加新生成的交易字典到对应列表,不存在时初始化列表。
- 简化了循环逻辑,直接指定生成的总交易条数,按需调整即可实现n个账户键,每个键对应m条交易记录的需求。
内容的提问来源于stack exchange,提问作者Duck_dragon
相关产品推荐
相关产品推荐

