Python调用detect_groups_tile_num取tile_num[0]报KeyError:0问题
问题原因
- 你在默认参数下调用
detect_groups_tile_num时,return_tile_num_pergroup参数默认值为True,触发了代码里的字段覆盖逻辑:你先给out['tile_num']赋值了全局范围的列表[min(tile_num), max(tile_num)],但紧接着因为return_tile_num_pergroup为True,直接把out['tile_num']重写成了按分组存储的字典,键是分组名,值才是对应分组的tile_num范围,自然没法用数字下标[0]访问字典,因此抛出KeyError。 - 你打印的结果
{'col': [0, 75]}也可以验证这一点:tile_num字段是字典不是列表,用数字0当键去取不存在的键就会报错。
解决方法
方案1:不改方法实现,调整调用逻辑
如果你需要按分组取tile_num范围,调用时指定分组名即可,比如你的分组是col,修改为:
start_tile_num = data.detect_groups_tile_num()['tile_num']['col'][0] if start_tile_num is None else start_tile_num end_tile_num = data.detect_groups_tile_num()['tile_num']['col'][1] if end_tile_num is None else end_tile_num
如果你只需要全局的tile_num范围,调用时把return_tile_num_pergroup设为False即可:
start_tile_num = data.detect_groups_tile_num(return_tile_num_pergroup=False)['tile_num'][0] if start_tile_num is None else start_tile_num end_tile_num = data.detect_groups_tile_num(return_tile_num_pergroup=False)['tile_num'][1] if end_tile_num is None else end_tile_num
方案2:修改方法实现,避免字段覆盖
原方法的实现不符合注释说明:注释标注返回字典包含groups、tile_num、tile_num_pergroup三个独立字段,但实际实现把分组范围塞到了tile_num字段里覆盖了全局范围,你可以调整这部分逻辑:
if return_tile_num: tile_num = [int(i.split('_')[1]) for i in colnames] out['tile_num'] = [min(tile_num), max(tile_num)] # 分组范围存到单独的tile_num_pergroup字段,不覆盖全局tile_num if return_tile_num_pergroup: out['tile_num_pergroup'] = {} for group in groups: group_columns = [i for i in colnames if search('^{0}_'.format(group), i)] group_tile_num = [int(i.split('_')[1]) for i in group_columns] out['tile_num_pergroup'][group] = [min(group_tile_num), max(group_tile_num)]
修改后你原来的调用逻辑['tile_num'][0]可以正常拿到全局起始tile_num,分组范围可以通过['tile_num_pergroup']字段单独获取,完全符合方法注释的设计预期。
内容的提问来源于stack exchange,提问作者melololo
相关产品推荐
相关产品推荐

