You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:00:45