如何倒序枚举Python中的列表并带有索引(从末尾开始)?

6

我希望能够遍历从Digikey API接收到的数据列表,但是在谷歌上搜索并没有得到太多帮助,因为函数enumerate(reversed(part.standard_pricing))不能正常工作,而且由于某些原因无法反转part.standard_pricing

期望的结果类似于:

for b_idx in range(part.standard_pricing, -1, -1):
            print(f"Test at: {b_idx} , Q: {part.standard_pricing[b_idx].break_quantity}")
            if PCountQ >= part.standard_pricing[b_idx].break_quantity:
                parts_df['PRICE_PER_PCB_Q'][idx] = part.standard_pricing[b_idx].unit_price * PCountQ
                break

但是range在列表上也不起作用...

我想这样做:

for b_idx, price_break in enumerate(part.standard_pricing):

只需要从part.standard_pricing的末尾开始,索引递减而不是递增即可。有没有Pythonic的方法实现这个想法?
3个回答

9
你可以在列表上调用 enumerate 函数,然后将其转换为列表,它将返回一个由元组组成的列表,每个元组都包含索引和值,最后在反向列表上进行迭代。
data = [1,2,3,4]
for i,d in reversed(list(enumerate(data))):
    print(i,d)
    
3 4
2 3
1 2
0 1
< p >< em >如果您不想在内存中再次复制该序列,您可以创建自定义生成器


def reverseEnum(data: list):
    for i in range(len(data)-1, -1, -1):
        yield (i, data[i])
for i, d in reverseEnum([1, 2, 3, 4]):
    print(i, d)
    
3 4
2 3
1 2
0 1

2
虽然这样做是可行的(+1),但它会在内存中创建一个新列表,只是为了迭代已经存在于内存中的内容。 - John Coleman
1
是的,在实际迭代之前先创建了列表,因为 enumerate 对象是一个生成器,所以无法反转。在这种情况下,可以创建一个自定义生成器。 - ThePyGuy
1
是的,不管怎样,这似乎是有效和简单的,这正是Python所擅长的,谢谢。 - Pongo

7

与其对反转后的列表进行reverse操作,我们也可以对反转后的列表进行enumerate操作,并使用一些数学计算来获得索引:

the_list = ["zeroth", "first", "second"]
length = len(the_list)

for j, value in enumerate(reversed(the_list), start=1):
    # "the" index is this
    i = length - j
    print(i, value)

获得

2 second
1 first
0 zeroth

你也可以选择 i = -j,得到 -1,-2,-3,这样当作为索引时,就会得到与2,1,0相同的值。


3

无需反转或复制列表,仅需在原处使用并从末尾进行索引:

for b_idx in range(len(part.standard_pricing)-1, -1, -1):
    print(f"Test at: {b_idx} , Q: {part.standard_pricing[b_idx].break_quantity}")

这是 Python 反模式的镜像

    for b_idx in range(len(part.standard_pricing)):

但由于它是一个镜像,您可以将其视为一个反-反模式。


谢谢,这听起来很有效。出于某种原因,我记得曾经试过这种方法,但是对我没有起作用:) - Pongo
1
如果这个答案对您有帮助,请接受它。 - BoarGules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接