python 当值为零时,如何使用enumerate跳过索引计数?

amrnrhlw  于 2022-12-02  发布在  Python
关注(0)|答案(3)|浏览(153)

我目前有一个带键值的字典和一个带值的列表。

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个数字,加起来就是item_number
我想要实现的是打印输出:

预期

{
    '1': 22,
    '2': 35,
    '3': 108,
    '4': 70,
    '5': 24,
    '6': 75,
    '7': 123,
    '8': 224,
    '9': 28
}

其中key是item_number,值是total
然而,我目前尝试的代码给了我错误:

print(data['item_number'][Index], value)
IndexError: list index out of range

我相信这是由于Index在每个循环中增加。我想知道如果值为0,我如何跳过计数增加?

oug3syen

oug3syen1#

请使用计数变量而不是enumerate(),或者在枚举之前进行筛选。

计数变量

index = 0
for value in data['total'].values():
    if value != 0:
        print((data['item_number'][index], value))
        index += 1

输出量:

('1', 22)
('2', 35)
('3', 108)
('4', 70)
('5', 24)
('6', 75)
('7', 123)
('8', 224)
('9', 28)

先过滤

for index, value in enumerate(v for v in data['total'].values() if v != 0):
    print((data['item_number'][index], value))

(Same输出)
使用zip()(如Andrej's answer)可以进一步简化此操作。

注意:为了简单起见,我在这里没有使用dict,因为您发布的代码没有使用dict。不过,我认为如何合并dict是显而易见的。

jmo0nnb3

jmo0nnb32#

如果我没理解错的话:

out = dict(
    zip(data["item_number"], (v for v in data["total"].values() if v != 0))
)
print(out)

印刷品:

{
    "1": 22,
    "2": 35,
    "3": 108,
    "4": 70,
    "5": 24,
    "6": 75,
    "7": 123,
    "8": 224,
    "9": 28,
}
8yparm6h

8yparm6h3#

这里有两项任务:
1.过滤掉data["total"]中的零值
1.创建一个字典,其中键是data["item_number"]的元素,值来自我们上面创建的过滤集合。
所以,让我们这样做:

filtered_values = [val for val in data["total"].values() if val]
# [22, 35, 108, 70, 24, 75, 123, 224, 28]

new_dict = dict(zip(data["item_number"], filtered_values))

它给出了所需的new_dict

{'1': 22,
 '2': 35,
 '3': 108,
 '4': 70,
 '5': 24,
 '6': 75,
 '7': 123,
 '8': 224,
 '9': 28}

如果您将filtered_values定义为生成器表达式,则可以保存一个通过data["total"]的循环,或者将这两行组合在一起:

new_dict = dict(zip(data["item_number"], (val for val in data["total"].values() if val)))

相关问题