嵌套for循环中locals()+eval()失效问题及代码函数化改造需求
问题:封装globals()[eval()]遍历逻辑时的变量访问问题
我之前用globals()[eval()]实现数据库字段的批量求和遍历,现在要把这段代码封装成函数以便从其他文件传参,但遇到了变量访问问题:
- 函数内使用
globals()无法正确访问循环中定义的变量 - 换成
locals()后,eval()返回空序列,同样无法访问外层循环的变量(如win、loss、tko等)
原代码
for fighter in ['1', '2']: win = 0 loss = 0 for outcome in ['win', 'loss']: tko = 0 sub = 0 dec = 0 for method in ['tko', 'sub', 'dec']: for rnd in ['1', '2', '3', '4', '5', '6']: globals()[eval('outcome')] += fights_fighters_table[ 'r' + rnd + '_' + method + '_' + outcome + '_' + fighter] globals()[eval('method')] += fights_fighters_table[ 'r' + rnd + '_' + method + '_' + outcome + '_' + fighter] # 将TKO/SUB/DEC的胜负统计写入DataFrame fights_fighters_table[method + '_' + outcome + '_' + fighter] = globals()[eval('method')] globals()[eval('outcome')] += fights_fighters_table['dq_' + outcome + '_' + fighter] fights_fighters_table[outcome + '_' + fighter] = globals()[eval('outcome')]
数据示例与预期结果
输入数据示例(fights_fighters_table部分字段)
r1_tko_win_1 = 4 r2_tko_win_1 = 2 r3_tko_win_1 = 0 r1_tko_loss_1 = 1 r2_tko_loss_1 = 0 r3_tko_loss_1 = 2 r1_sub_win_1 = 0 r2_sub_win_1 = 1 r2_sub_win_1 = 0 r1_sub_loss_1 = 1 r2_sub_loss_1 = 1 r3_sub_loss_1 = 0
预期输出结果(求和后新增字段)
win_1 = 7 loss_1 = 5 tko_win_1 = 6 sub_win_1 = 1 tko_loss_1 = 3 sub_loss_1 = 2
完整精简数据示例
r1_tko_win_1 3839 r2_tko_win_1 3839 r3_tko_win_1 3839 r4_tko_win_1 3839 r5_tko_win_1 3839 r6_tko_win_1 3839 r1_tko_loss_1 3839 r2_tko_loss_1 3839 r3_tko_loss_1 3839 r4_tko_loss_1 3839 r5_tko_loss_1 3839 r6_tko_loss_1 3839 r1_sub_win_1 3839 r2_sub_win_1 3839 r3_sub_win_1 3839 r4_sub_win_1 3839 r5_sub_win_1 3839 r6_sub_win_1 3839 r1_sub_loss_1 3839 r2_sub_loss_1 3839 r3_sub_loss_1 3839 r4_sub_loss_1 3839 r5_sub_loss_1 3839 r6_sub_loss_1 3839 r1_dec_win_1 3839 r2_dec_win_1 3839 r3_dec_win_1 3839 r4_dec_win_1 3839 r5_dec_win_1 3839 r6_dec_win_1 3839 r1_dec_loss_1 3839 r2_dec_loss_1 3839 r3_dec_loss_1 3839 r4_dec_loss_1 3839 r5_dec_loss_1 3839 r6_dec_loss_1 3839 r1_tko_win_2 3839 r2_tko_win_2 3839 r3_tko_win_2 3839 r4_tko_win_2 3839 r5_tko_win_2 3839 r6_tko_win_2 3839 r1_tko_loss_2 3839 r2_tko_loss_2 3839 r3_tko_loss_2 3839 r4_tko_loss_2 3839 r5_tko_loss_2 3839 r6_tko_loss_2 3839 r1_sub_win_2 3839 r2_sub_win_2 3839 r3_sub_win_2 3839 r4_sub_win_2 3839 r5_sub_win_2 3839 r6_sub_win_2 3839 r1_sub_loss_2 3839 r2_sub_loss_2 3839 r3_sub_loss_2 3839 r4_sub_loss_2 3839 r5_sub_loss_2 3839 r6_sub_loss_2 3839 r1_dec_win_2 3839 r2_dec_win_2 3839 r3_dec_win_2 3839 r4_dec_win_2 3839 r5_dec_win_2 3839 r6_dec_win_2 3839 r1_dec_loss_2 3839 r2_dec_loss_2 3839 r3_dec_loss_2 3839 r4_dec_loss_2 3839 r5_dec_loss_2 3839 r6_dec_loss_2 3839
注:需要对两名拳手('1'和'2')分别执行上述求和操作
内容的提问来源于stack exchange,提问作者MMA Attic
相关产品推荐
相关产品推荐

