使用enumerate时遇值为0如何跳过索引计数?解决索引越界问题
问题:过滤字典非零值并与列表元素一一对应生成新字典
问题背景
现有如下Python数据结构及代码:
data = { 'total': { '06724': 0, '06725': 0, '06726': 0, '06727': 0, '06712': 22, '06713': 35, '06714': 108, '06715': 70, '06716': 0, '06717': 24, '06718': 0, '06719': 0, '06720': 0, '06709': 75, '06710': 123, '06711': 224, '06708': 28, '06723': 0, '06721': 0, '06722': 0 }, 'item_number': ['1', '2', '3', '4', '5', '6', '7', '8', '9'] } for Index, value in enumerate(data['total'].values()): if value and value != '0': print(data['item_number'][Index], value)
需求是过滤掉total中值为0的项,将剩余9个非0值与item_number列表元素一一对应,生成如下预期结果:
{ '1': 22, '2': 35, '3': 108, '4': 70, '5': 24, '6': 75, '7': 123, '8': 224, '9': 28 }
但运行代码时出现如下错误:
print(data['item_number'][Index], value) IndexError: list index out of range
错误原因
enumerate会为total的每一个值生成连续递增的索引(从0到19),而item_number只有9个元素(索引0到8)。当循环到后面的非零值时,对应的索引会超过item_number的最大索引,导致越界错误。
解决方案
方法1:手动维护计数器
自己定义一个计数器,仅在遇到非零值时递增,确保始终和item_number的索引匹配:
data = { 'total': { '06724': 0, '06725': 0, '06726': 0, '06727': 0, '06712': 22, '06713': 35, '06714': 108, '06715': 70, '06716': 0, '06717': 24, '06718': 0, '06719': 0, '06720': 0, '06709': 75, '06710': 123, '06711': 224, '06708': 28, '06723': 0, '06721': 0, '06722': 0 }, 'item_number': ['1', '2', '3', '4', '5', '6', '7', '8', '9'] } result = {} count = 0 for value in data['total'].values(): if value != 0: # 注意value是数字类型,无需判断不等于字符串'0' result[data['item_number'][count]] = value count += 1 print(result)
方法2:先过滤非零值再配对
先从total中提取所有非零值,得到一个长度为9的列表,再用zip和item_number配对生成字典:
data = { 'total': { '06724': 0, '06725': 0, '06726': 0, '06727': 0, '06712': 22, '06713': 35, '06714': 108, '06715': 70, '06716': 0, '06717': 24, '06718': 0, '06719': 0, '06720': 0, '06709': 75, '06710': 123, '06711': 224, '06708': 28, '06723': 0, '06721': 0, '06722': 0 }, 'item_number': ['1', '2', '3', '4', '5', '6', '7', '8', '9'] } # 过滤出所有非零值 non_zero_values = [v for v in data['total'].values() if v != 0] # 用zip配对两个列表,转为字典 result = dict(zip(data['item_number'], non_zero_values)) print(result)
两种方法都能生成预期的字典结果,其中方法2更简洁,利用列表推导式和内置函数实现,可读性更高。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

